JavaRush /Java блог /Архив info.javarush /Итерация vs. Рекурсия
Integer
8 уровень
Würzburg

Итерация vs. Рекурсия

Статья из группы Архив info.javarush
Есть два способа решения цикличных алгоритмов - итерации и рекурсии. Существуют ли задачи которые можно решить рекурсивно, но нельзя решить итеративно?
Комментарии (3)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Joysi Уровень 41
5 февраля 2016
в дополнение. При вызове функций в стек обычно кладется текущее состояние регистров и другая информация текущего окружения, которая при возврате из функции будет обратно восстановлена чтобы вернуть состояние до вызова функции(что занимается не сколько время, сколько место в стеке). При итерационном подходе — вызвал функцию, внутри ней может еще несколько вложенных вызовов иных функций и т.п. Суммарно уровень вложенности небольшой.
При рекурсиях же — уровень вложенности гораздо выше и шанс нарваться на переполнение стека намного выше.
Хотя да — красота кода и объем занимаемого исходного кода оптимальны.
mrserfr Уровень 33
5 февраля 2016
рекурсия в подавляющем количестве примеров выигрывает в простоте кода. если тебе не важны лишние 0.0001 секунды (ты меня понял), то ИМХО рекурсия лучше, ее просто понять легче в коде, чем адскую смесь из итераций с переменными a,b,c,i,j,k,a1,b1,… и тд и тп :) хотя задачи бывают разные! бывает, что все наоборот…
Joysi Уровень 41
5 февраля 2016
По моему любую задачу можно развернуть из рекурсии в итерационный вид. При этом с точки зрения производительности обычно выигрываем (нет необходимости хранить промежуточные состояния в стеке между вызовами), но можем проиграть в наглядности реализации алгоритма.

Можно и наоборот, из итерации нырнуть в рекурсию.
Например
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);
}