рекурсия с помощью только область "кучи"

Там примеры рекурсии используют только область "кучи"?

5
задан Georg Fritzsche 10 May 2010 в 23:31
поделиться

5 ответов

В C рекурсия на основе вызова функции всегда использует стек, почти по определению.

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

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

7
ответ дан 13 December 2019 в 19:23
поделиться

Вы можете сделать что-нибудь безумное, например, выделить новую область, отключить прерывания и все остальное (что невозможно во многих системах) и установить указатель стека на эта область malloc. Технически вы все еще играете со стеком, но теперь это место находится в куче. Это не лучшая идея, но она может работать в некоторых системах со встроенными типами, где у вас есть такой уровень контроля.

4
ответ дан 13 December 2019 в 19:23
поделиться

Во многих реализациях аргументы вызова функции хранятся в стеке. Такая информация, как адрес для возврата, также может храниться в стеке. Таким образом, рекурсивная функция без использования стека может оказаться невыполнимой.

Проверьте в документации компилятора, можно ли вызвать функцию, не используя место в стеке. Если да, то вы на верном пути.

0
ответ дан 13 December 2019 в 19:23
поделиться

Чтобы функция была рекурсивной, она должна вызывать себя хотя бы один раз. Когда он вызывает себя, он помещает указатель на себя в стек для возврата рекурсивного вызова. Стек, конечно, не является кучей, поэтому рекурсивная функция, использующая только кучу, невозможна.

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

0
ответ дан 13 December 2019 в 19:23
поделиться

Да, можно реализовать рекурсию, используя только кучу, а в некоторых случаях это очень желательно. Например, см. Stackless Python . Одним из основных преимуществ этого является то, что весь поток может стать сериализуемым, и вы можете буквально отправить поток с одного хоста на другой (даже с другой архитектурой и операционной системой!).

0
ответ дан 13 December 2019 в 19:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: