По кустарному: допустим, у нас есть функция, использующая рекурсию. Мы посчитали, что в самом максимальном случае при ее выполнении глубина рекурсии (количество вложенных вызовов) составит
. Теперь мы пишем в тексте кода
копий этой функции, и при каждом вложенном вызове вызываем очередную копию. Рекурсия ли это? Зависит от определения, но стек загружается точно так же, не считая не оптимального кода. А если ставить вопрос не о рекурсии, а о минимизации используемой ОЗУ, тогда становится интереснее. Даже если мы откажемся от использования функции как таковых, чтобы не помещать каждый раз в стек (системный или собственный) весь контекст и адрес возврата, то нам все равно может понадобиться память для хранения результата истории вызовов. Например, функцию
можно написать рекурсивно, со всеми прелестями загрузки стека, или просто в цикле "с конца" при единственном уровне вложенности функций. А функцию обхода графа из вершины мы можем написать как угодно, но сам путь при этом нам придется все равно хранить, хотя и в этом случае вложенные контексты в стеке не обязательны.