標籤:style blog color strong 資料 width
如果我們需要重複多次計算相同的問題,通常可以選擇遞迴或者迴圈
遞迴的好處是代碼簡潔
但是遞迴也有明顯的缺點:
- 遞迴是由於函數調用自身,而函數調用是需要有時間和空間的消耗的。每一函數調用,都需要在記憶體棧中分配空間以儲存參數,返回地址和臨時變數,而且往棧中壓入資料和彈出資料都需要時間。
- 遞迴中有可能很多計算都是重複的。遞迴的本質是把一個大問題分解成小問題,但是多個小問題之間會有重疊的部分
- 遞迴可能會引發問題:調用棧溢出。
斐波拉契數列
public class Exam9_Fibonacci { public static void main(String[] args) { int n=10; //遞迴 long start = System.currentTimeMillis(); System.out.println("當n= "+n+" 時的結果是 "+ Fibonacci(n)); long end = System.currentTimeMillis(); System.out.println("遞迴方式:"); System.out.println("啟動並執行時間是"+(end-start)+"ms"); //迴圈 long start1 = System.currentTimeMillis(); System.out.println("\n迴圈方式:"); Circulation(n); long end1 = System.currentTimeMillis(); System.out.println("啟動並執行時間是"+(end1-start1)+"ms"); } //利用遞迴方式 private static long Fibonacci(int n) { if(n<=0) return 0; if(n==1) return 1; return Fibonacci(n-1) + Fibonacci(n-2); } //利用迴圈方式 private static long Circulation(int n) { if(n<=0) return 0; if(n==1) return 1; long finSOne= 0; long finSTwo = 1; long fibN= 0; for(int i=2;i<=n;i++) { fibN = finSOne+finSTwo; finSOne = finSTwo; finSTwo = fibN; } return fibN; }}
得到的結果是:
n值 |
最終結果 |
遞迴方式對Fibonacci()
方法的調用次數 |
遞迴方法時間(ms) |
迴圈方法(ms) |
10 |
55 |
177 |
1 |
0 |
20 |
6765 |
21891 |
3 |
0 |
30 |
832040 |
2692537 |
14 |
0 |
40 |
102334155 |
331160281 |
1254 |
0 |
50 |
12586269025 |
40730022147 |
150514 |
0 |
60 |
|
|
時間太長 |
|
明顯的看出,時間複雜的:
遞迴方式是以n的指數的方式遞增的
迴圈是O(n)
所以,對於斐波那契數列,迴圈的方式更好