Там примеры рекурсии используют только область "кучи"?
В C рекурсия на основе вызова функции всегда использует стек, почти по определению.
Если вы хотите преобразовать рекурсию в итерацию, то можно использовать только пространство кучи, но на самом деле это не рекурсия. Вы бы сделали это, реализовав стек в куче.
Некоторые задачи могут использовать хвостовую рекурсию , которая многократно перезаписывает одну и ту же область стека.
Вы можете сделать что-нибудь безумное, например, выделить новую область, отключить прерывания и все остальное (что невозможно во многих системах) и установить указатель стека на эта область malloc. Технически вы все еще играете со стеком, но теперь это место находится в куче. Это не лучшая идея, но она может работать в некоторых системах со встроенными типами, где у вас есть такой уровень контроля.
Во многих реализациях аргументы вызова функции хранятся в стеке. Такая информация, как адрес для возврата, также может храниться в стеке. Таким образом, рекурсивная функция без использования стека может оказаться невыполнимой.
Проверьте в документации компилятора, можно ли вызвать функцию, не используя место в стеке. Если да, то вы на верном пути.
Чтобы функция была рекурсивной, она должна вызывать себя хотя бы один раз. Когда он вызывает себя, он помещает указатель на себя в стек для возврата рекурсивного вызова. Стек, конечно, не является кучей, поэтому рекурсивная функция, использующая только кучу, невозможна.
(По крайней мере, не в C. Функциональные языки оптимизированы для повторного использования пространства стека и не выделяют указатели для обратных вызовов)
Да, можно реализовать рекурсию, используя только кучу, а в некоторых случаях это очень желательно. Например, см. Stackless Python . Одним из основных преимуществ этого является то, что весь поток может стать сериализуемым, и вы можете буквально отправить поток с одного хоста на другой (даже с другой архитектурой и операционной системой!).