Есть примеры рекурсии, использующей только область кучи?рекурсия, использующая только кучную область
ответ
В C функция call-based recursion всегда использует стек почти по определению.
Если вы хотите конвертировать рекурсию на итерацию, тогда можно использовать только кучу пространства, но это не настоящая рекурсия. Вы сделали бы это, выполнив стек в куче.
Некоторые проблемы могут использовать tail recursion, что неоднократно перезаписывает одну и ту же область стека.
У вас может быть гибридный метод. Стек вызовов все еще используется для простых параметров и возвращает адреса, но большие параметры, такие как массивы и strcuts, хранятся в кучке, выделенном кучей. Таким образом, вы можете достичь (относительно) глубокой рекурсии, не быстро взломав стек вызовов (call). –
Вы можете сделать что-то сумасшедшее, как malloc в новой области, отключить прерывания и почти все остальное (что невозможно во многих системах) и установить указатель стека на эту область malloc. Вы по-прежнему играете со стеком, но местоположение этого стека теперь находится в куче. Не очень хорошая идея, но она может работать на некоторых системах с встроенным типом, где у вас есть этот уровень контроля.
Во многих реализациях аргументы вызова функции хранятся в стеке. Информация, такая как адрес для возврата, также может быть сохранена в стеке. Таким образом, наличие рекурсивной функции без использования стека может оказаться невозможным.
Проверьте документацию вашего компилятора, чтобы узнать, можно ли вызывать функцию без использования какой-либо комнаты в стеке. Если это так, вы уже в пути.
Для того чтобы функция была рекурсивной, она должна вызывать себя хотя бы один раз. Когда он вызывает себя, он помещает указатель на себя в стек для возврата рекурсивного вызова. Стек, конечно, не является кучей, и поэтому рекурсивная функция, использующая только кучу, невозможна.
(по крайней мере, не в C. Функциональные языки оптимизированы для повторного использования пространства стека, а не выделять указатели для возврата вызовов)
Да, можно реализовать рекурсию, используя только кучу, а в некоторых случаев это очень желательно. Например, см. Stackless Python. Одним из главных преимуществ этого является то, что весь поток может стать сериализуемым, и вы можете буквально отправить поток с одного узла на другой (даже с другой архитектурой & операционной системы!).
- 1. Область и рекурсия Javascript
- 2. Рекурсия область применения данные выпуск
- 3. Лексическая область/закрытие и глобальная рекурсия функций
- 4. Рекурсия Python и область действия переменной
- 5. Графика, использующая только стандартный C++?
- 6. Страница ASP.NET, использующая только Response.Write
- 7. Вставка треугольника в div, использующая только css
- 8. Матрица Левенштейна, использующая только диагональную полосу
- 9. Модель Rails, использующая только стандартную локаль
- 10. функция regex, использующая только одну цитату
- 11. Закройте область только меня
- 12. Рекурсия или не рекурсия
- 13. рекурсия каталоги идет только один файл глубокого
- 14. получить кучную память, используемую методом в классе java
- 15. Таблица символов, использующая векторы
- 16. Щелкните область только один раз
- 17. Факториальная программа, использующая рекурсию, возвращающую неправильное значение
- 18. Вспышка, использующая AS3.0
- 19. Ошибка синтаксиса, использующая CGRect
- 20. Рекурсия Фибоначчи?
- 21. Рекурсия Powershell
- 22. Как установить максимальную кучную память JVM для Apache Ignite v1.7?
- 23. Массив Рекурсия
- 24. Служба WCF, использующая шифрование только для некоторых клиентов
- 25. Программа, использующая SQLite, запущенная только из bin \ Debug location
- 26. Мне нужна помощь, использующая CAST, чтобы вернуть только месяц/день
- 27. Директива Angular.js, использующая stellar.js, используется несколько раз - только первый работает
- 28. Location background Служба, использующая GoogleApiClient
- 29. Рекурсия Ошибка: Максимальная глубина рекурсия превысила
- 30. Ранжирование система, использующая MySQLi
Это не вопрос домашней работы, не так ли? – WhirlWind
@gcc Не нужно защищаться ... это похоже на типичный вопрос о домашнем задании, и если да, я бы предпочел не отвечать на него напрямую. Если это не так, проблем нет. – WhirlWind
Вопросы, которые не упоминают, почему они вам нужны, часто являются домашними заданиями. Любой OP должен быть в порядке с людьми, желающими убедиться, что они не выполняют домашнюю работу другого человека. –