С# Рекурсия Глубина - как глубоко вы можете идти

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

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

который зависит от стекирования....

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

Ответ 1

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

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

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

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

Источник

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

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