Общая рекурсия в хвостовую рекурсию

Возможно ли теоретически преобразовать каждый вид общей рекурсии в хвостовую рекурсию? Эквивалентны ли они, например, с точки зрения лямбда-исчисления? Это спор между мной и знакомым.

Я считаю, что это невозможно всегда. Например, если у вас есть функция, которая рекурсивно вызывает себя дважды или трижды, вы не можете превратить все рекурсивные вызовы в хвостовые вызовы, верно? Или всегда есть способ уменьшить количество рекурсивных вызовов до одного рекурсивного вызова?


person PDani    schedule 16.07.2014    source источник
comment
Возможно, вы захотите разместить это на обмене стеком программистов // programmers.stackexchange.com   -  person AnotherUser    schedule 16.07.2014


Ответы (1)


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

Некоторые могут сказать, что цикл + явный стек является итеративным, но IMO это все еще рекурсия, и обход дерева будет увеличивать стек так же, как и общая рекурсия.

person Sylwester    schedule 18.07.2014