遞迴和迭代的區別
阿新 • • 發佈:2018-12-24
遞迴和迭代都是迴圈中的一種。
簡單地說,遞迴是重複呼叫函式自身實現迴圈。迭代是函式內某段程式碼實現迴圈,而迭代與普通迴圈的區別是:迴圈程式碼中參與運算的變數同時是儲存結果的變數,當前儲存的結果作為下一次迴圈計算的初始值。
遞迴迴圈中,遇到滿足終止條件的情況時逐層返回來結束。迭代則使用計數器結束迴圈。當然很多情況都是多種迴圈混合採用,這要根據具體需求。
使用遞迴要注意的有兩點:
1)遞迴就是在過程或函式裡面呼叫自身;
2)在使用遞迴時,必須有一個明確的遞迴結束條件,稱為遞迴出口.
遞迴分為兩個階段:
1)遞推:把複雜的問題的求解推到比原問題簡單一些的問題的求解;
2)迴歸:當獲得最簡單的情況後,逐步返回,依次得到複雜的解.
遞迴和迭代的空間利用率
迭代是逐漸逼近,用新值覆蓋舊值,直到滿足條件後結束,不儲存中間值,空間利用率高。
利用遞迴可以解決很多問題:如揹包問題,漢諾塔問題,斐波那契數列等
遞迴是將一個問題分解為若干相對小一點的問題,遇到遞迴出口再原路返回,因此必須儲存相關的中間值,這些中間值壓入棧儲存,問題規模較大時會佔用大量記憶體。下面用一個簡單的斐波那契數列來演示遞迴:
迭代經典例子就是實數的累加,比如計算1-100所有實數的和。package cn.edu.ahui; import java.util.Scanner; //實現斐波那契序列 public class Fibonacci { int result; public int fibo(int n){ if (n != 1 && n != 2){ //遞迴 result = fibo(n-1) + fibo(n-2); return result; } else return 1; } public static void main(String[] args){ Fibonacci fibonacci = new Fibonacci(); System.out.print("請輸入一個整數n:"); Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int a = fibonacci.fibo(n); System.out.println(a); } }
int v=1; for(i=2;i<=100;i++) { v=v+i; }
兩者之間的關係:1) 遞迴中一定有迭代,但是迭代中不一定有遞迴,大部分可以相互轉換。
2) 能用迭代的不用遞迴,遞迴呼叫函式,計算有重複,浪費空間,並且遞迴太深容易造成堆疊的溢位.