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

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

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

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