Предисловие
Я видел этот контент недавно, когда читал книгу, и я чувствовал себя довольно полезным. Итерация использует петлю (для, в то время как, делай ... Удое) или итератор, который выходит, когда условие цикла не выполнено. Рекурсия, как правило, является рекурсией функции, которую можно назвать сама по себе или не направленными вызовами, то есть методом метода вызовов B, а метод B-вызовов B вызывает A по очереди, а условие для рекурсивного выхода-это оператор IF и ELE, и выходит, когда условие соответствует основу.
Вышеуказанное - синтаксические характеристики итерации и рекурсии. Каковы различия между ними в Java? Давайте узнаем больше об этой статье ниже.
1. Рекурсия
Когда дело доходит до итерации, мы должны упомянуть математическое выражение: n!=n*(n-1)*(n-2)*...*1
Есть много способов рассчитать фактические показатели. Любой с определенной математической основой знает n!=n*(n-1)! Следовательно, реализация кода может быть написана напрямую как:
Код 1
int informorial (int n) {if (n == 1) {return 1; } else {return n*factorial (n-1); }} При выполнении приведенного выше кода машина фактически должна выполнить серию умножений: factorial(n) → factorial(n-1) → factorial(n-2) →… → factorial(1) . Следовательно, необходимо отслеживать (отслеживать результат последнего расчета) и умножение вызова для выполнения расчетов (построить цепочку умножения). Этот тип операции, которая постоянно вызывает себя, называется рекурсией. Рекурсия может быть дополнительно разделена на линейную рекурсию и численную рекурсию. Количество информации линейно увеличивается с вводом алгоритма. Рекурсия называется линейной рекурсией. Рассчитайте n! (Фабрика) - это линейная рекурсия. Поскольку при увеличении N время, необходимое для расчета линейно. Другой тип информации, которая растет в геометрической прогрессии с увеличением ввода, называется рекурсием дерева.
2. Итерация
Еще один способ рассчитать n! IS: сначала рассчитайте 1 умножить на 2, затем умножьте результат на 3, а затем умножьте результат на 4 ... и умножьте до N. Во время реализации программы можно определить счетчик. Каждый раз, когда выполняется умножение, счетчик увеличивается один раз до тех пор, пока значение счетчика не будет равным N. Код выглядит следующим образом:
Код два
int informorial (int n) {int product = 1; for (int i = 2; i <n; i ++) {продукт *= i; } вернуть продукт;}По сравнению с кодом первого кода два не строит цепочку умножения. При выполнении каждого этапа расчета вам нужно только знать текущий результат (продукт) и значения i. Эта форма расчета называется итерацией. Есть несколько условий для итерации: 1. Существует переменная с начальным значением. 2. Правило, которое объясняет, как значения переменных обновляются. 3. Конечное условие. (Три элемента петли: переменные петли, тела петли и условия завершения петли). То же, что и рекурсия. Требование времени, которое становится линейным по мере того, как вход растут линейно, можно назвать линейной итерацией.
3. Итерация против рекурсии
После сравнения двух программ мы можем обнаружить, что они выглядят почти одинаково, особенно с точки зрения их математических функций. При расчете n!, Их шаги расчета пропорциональны значению n. Однако, если мы возьмем перспективу программы и рассмотрим, как они работают, то два алгоритма очень разные.
(Примечание: исходный текст немного не имеет значения относительно разницы, поэтому я не буду переводить его здесь. Ниже приведено собственное резюме автора.)
Прежде всего, анализировать рекурсию. Фактически, самая большая вещь в рекурсии - это разложить сложный алгоритм на несколько идентичных повторяющихся шагов. Следовательно, использование рекурсии для реализации вычислительной логики часто требует только очень короткого кода для решения, и такой код легче понять. Однако рекурсия означает большое количество функциональных вызовов. Причина, по которой локальный состояние функционального вызова записывается с использованием стека. Следовательно, это может тратить много места, и если рекурсия слишком глубока, это может вызвать переполнение стека.
Далее анализируйте итерации. Фактически, рекурсия может быть заменена на итерацию. Однако по сравнению с простотой и пониманием рекурсии итерация более жесткая и трудно понять. Особенно при столкновении с более сложным сценарием. Тем не менее, сложность понимания кода также приносит более очевидные моменты. Эффективность итерации выше рекурсии, а также относительно невелика по потреблению пространства.
В рекурсии должны быть итерации, но в итерациях не может быть повторения, и большинство из них могут быть преобразованы друг в друга.
Если вы можете использовать итерацию, не используйте рекурсию. Рекурсивно вызова функций не только тратит впустую пространство, но и может легко вызвать переполнение стека, если рекурсия слишком глубока.
4. Рекурсия чисел
Как упоминалось ранее, объем информации, которую дерево рекурсив увеличивается в геометрической прогрессии с увеличением ввода. Последовательность Фибоначчи является типичным примером:
В описании текста сумма первых двух чисел в последовательности Фибоначчи равна третьему номеру: 0, 1, 1, 2, 3, 5, 8, 13, 21 ...
Рекурсивный код реализации выглядит следующим образом:
int fib (int n) {if (n == 0) {return 0; } else if (n == 1) {return 1; } else {return fib (n-1) + fib (n-2); }} Во время процесса расчета, чтобы рассчитать fib(5) , программа должна сначала рассчитать fib(4) и fib(3) . Чтобы рассчитать fib(4) , программа также необходимо рассчитать fib(3) и fib(2) первым. FIB (3) рассчитывается дважды в течение этого процесса.
Из процесса расчета, проанализированного выше, мы можем сделать вывод: существует избыточный расчет для реализации последовательности Fibonacci с использованием рекурсии.
Как упомянуто выше, рекурсивные алгоритмы обычно могут быть реализованы итеративно, и то же самое относится и к расчетам последовательностей Фибоначчи.
int fib (int n) {int fib = 0; int a = 1; for (int i = 0; i <n; i ++) {int temp = fib; fib = fib + a; a = темп; } return fib;}Хотя в методе рекурсии будут избыточные расчеты, его можно заменить на итерацию. Но это не означает, что рекурсия может быть полностью заменена. Потому что рекурсия имеет лучшую читаемость.
Суммировать
Вышеуказанное - все содержание этой статьи. Я надеюсь, что содержание этой статьи будет полезно для всех в обучении или использовании Java. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения.