2010-05-10 3 views
5

Есть примеры рекурсии, использующей только область кучи?рекурсия, использующая только кучную область

+2

Это не вопрос домашней работы, не так ли? – WhirlWind

+4

@gcc Не нужно защищаться ... это похоже на типичный вопрос о домашнем задании, и если да, я бы предпочел не отвечать на него напрямую. Если это не так, проблем нет. – WhirlWind

+0

Вопросы, которые не упоминают, почему они вам нужны, часто являются домашними заданиями. Любой OP должен быть в порядке с людьми, желающими убедиться, что они не выполняют домашнюю работу другого человека. –

ответ

7

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

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

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

+0

У вас может быть гибридный метод. Стек вызовов все еще используется для простых параметров и возвращает адреса, но большие параметры, такие как массивы и strcuts, хранятся в кучке, выделенном кучей. Таким образом, вы можете достичь (относительно) глубокой рекурсии, не быстро взломав стек вызовов (call). –

4

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

+0

Я не уверен, что я покупаю, что устраняет стек, но +1 для творчества. – WhirlWind

+2

Я использовал это на Palm для реализации AI игры с глубокой рекурсией. – sigfpe

+0

Тогда вы идете :) –

0

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

Проверьте документацию вашего компилятора, чтобы узнать, можно ли вызывать функцию без использования какой-либо комнаты в стеке. Если это так, вы уже в пути.

0

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

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

0

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

Смежные вопросы