Есть два способа решения цикличных алгоритмов - итерации и рекурсии. Существуют ли задачи которые можно решить рекурсивно, но нельзя решить итеративно?
в дополнение. При вызове функций в стек обычно кладется текущее состояние регистров и другая информация текущего окружения, которая при возврате из функции будет обратно восстановлена чтобы вернуть состояние до вызова функции(что занимается не сколько время, сколько место в стеке). При итерационном подходе — вызвал функцию, внутри ней может еще несколько вложенных вызовов иных функций и т.п. Суммарно уровень вложенности небольшой.
При рекурсиях же — уровень вложенности гораздо выше и шанс нарваться на переполнение стека намного выше.
Хотя да — красота кода и объем занимаемого исходного кода оптимальны.
рекурсия в подавляющем количестве примеров выигрывает в простоте кода. если тебе не важны лишние 0.0001 секунды (ты меня понял), то ИМХО рекурсия лучше, ее просто понять легче в коде, чем адскую смесь из итераций с переменными a,b,c,i,j,k,a1,b1,… и тд и тп :) хотя задачи бывают разные! бывает, что все наоборот…
По моему любую задачу можно развернуть из рекурсии в итерационный вид. При этом с точки зрения производительности обычно выигрываем (нет необходимости хранить промежуточные состояния в стеке между вызовами), но можем проиграть в наглядности реализации алгоритма.
Можно и наоборот, из итерации нырнуть в рекурсию.
Например
for (int i = 1; i <= 10; i++) System.out.println(i);
легким движение руки превращается в:
public static void main(String[] args) {
recursion(1,10);
}
public static void recursion(int i, int limit) {
System.out.println(i);
if (i<limit) recursion(i+1, limit);
}
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
При рекурсиях же — уровень вложенности гораздо выше и шанс нарваться на переполнение стека намного выше.
Хотя да — красота кода и объем занимаемого исходного кода оптимальны.
Можно и наоборот, из итерации нырнуть в рекурсию.
Например
легким движение руки превращается в: