C # Глубина рекурсии - как глубоко вы можете пойти - PullRequest
45 голосов
/ 22 декабря 2010

Есть ли какой-то контроль, сколько вы можете рекурсивно вызывать что-то?

Из базовой тестовой программы я получаю глубину рекурсии чуть более 18k

, которая зависит от размера стека ....

Есть ли способ установить кусок памяти (возможно, поток) с массивным стеком для увеличения глубины рекурсии?

Ответы [ 4 ]

47 голосов
/ 22 декабря 2010

Я увеличил размер стека во время распознавания некоторых документов.Это было действительно необходимо.

Таким образом, вы можете увеличить размер стека для потока, используя следующий код:

var stackSize = 10000000;
Thread thread = new Thread(new ThreadStart(BigRecursion), stackSize);

Thread (ThreadStart, Int32) - инициализирует новый экземпляр потокакласс, задающий максимальный размер стека для потока.

Источник

Надеюсь, это то, что вам нужно.

20 голосов
/ 22 декабря 2010

Я думаю, вы рискуете проблемами здесь.Трудно точно определить, сколько стека будет использовать рекурсивный алгоритм.И, если вы дошли до того, что возникает вопрос о том, хватит ли этого, я бы искал другой подход.

Большинство рекурсивных алгоритмов можно переписать так, чтобы они не были рекурсивными.Затем вы можете выделить столько памяти, сколько вам нужно, и даже изящно восстановить, если этого недостаточно.

5 голосов
/ 22 декабря 2010

Размер стека по умолчанию хранится в заголовке PE.

Если вы сами создаете поток, у Thread есть конструктор, который принимает размер стека в качестве параметра.

Однако размер стека .NET по умолчанию, равный 1 МБ, должен быть достаточным для большинства задач, поэтому перед его изменением вы должны хотя бы просмотреть задачу.

3 голосов
/ 01 октября 2013

Даже если вам удастся получить большую глубину рекурсии, просто по соображениям производительности я бы реализовал этот алгоритм без рекурсии.Вызовы методов намного дороже, чем итерации в цикле while.Я бы настоятельно не рекомендовал реализовывать все, что требует возни с размером стека по умолчанию.

Я иногда использую рекурсию, но только когда глубина вызова определена и мала (например, меньше 100).При создании коммерческого программного обеспечения использование рекурсивных алгоритмов с неопределенным числом итераций совершенно непрофессионально и может вызвать у вас очень злых клиентов.

...