1. 程式人生 > >遞迴和迭代的區別

遞迴和迭代的區別

遞迴和迭代都是迴圈中的一種。

簡單地說,遞迴是重複呼叫函式自身實現迴圈。迭代是函式內某段程式碼實現迴圈,而迭代與普通迴圈的區別是:迴圈程式碼中參與運算的變數同時是儲存結果的變數,當前儲存的結果作為下一次迴圈計算的初始值。

遞迴迴圈中,遇到滿足終止條件的情況時逐層返回來結束。迭代則使用計數器結束迴圈。當然很多情況都是多種迴圈混合採用,這要根據具體需求。

使用遞迴要注意的有兩點:

1)遞迴就是在過程或函式裡面呼叫自身;
2)在使用遞迴時,必須有一個明確的遞迴結束條件,稱為遞迴出口.

遞迴分為兩個階段:

1)遞推:把複雜的問題的求解推到比原問題簡單一些的問題的求解;

2)迴歸:當獲得最簡單的情況後,逐步返回,依次得到複雜的解.

遞迴和迭代的空間利用率

迭代是逐漸逼近,用新值覆蓋舊值,直到滿足條件後結束,不儲存中間值,空間利用率高
遞迴是將一個問題分解為若干相對小一點的問題,遇到遞迴出口再原路返回,因此必須儲存相關的中間值,這些中間值壓入棧儲存,問題規模較大時會佔用大量記憶體。

利用遞迴可以解決很多問題:如揹包問題,漢諾塔問題,斐波那契數列等

下面用一個簡單的斐波那契數列來演示遞迴:

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);
	}	
}
迭代經典例子就是實數的累加,比如計算1-100所有實數的和。
int v=1;
for(i=2;i<=100;i++)
{
    v=v+i;
}

兩者之間的關係:

1) 遞迴中一定有迭代,但是迭代中不一定有遞迴,大部分可以相互轉換。

2) 能用迭代的不用遞迴,遞迴呼叫函式,計算有重複,浪費空間,並且遞迴太深容易造成堆疊的溢位.