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