裴波那契數列的遞迴實現與非遞迴實現
阿新 • • 發佈:2019-02-03
斐波那契數列是數學家列昂納多·斐波那契(Leonardoda Fibonacci[1] )以兔子繁殖為例子而引入,也稱為“兔子數列”。
指的是這樣一個數列:0、1、1、2、3、5、8、13、21、34、……
在數學上,斐波納契數列以如下被以遞迴的方法定義:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)
由於遞迴在計算過程中非常慢,所以本文提供了裴波那契數列的非遞迴實現。並且提供時間引數,用以對比兩種方式的效能。
遞迴的思路是套用公式:F(n) = F(n-1) + F(n-2)
非遞迴的方式:每次儲存上一次計算的結果,當計算新的一天時,只需要把儲存的結果相加即可,而不用遞迴了。
public static void main(String[] args) { long currentTime1 = System.currentTimeMillis(); System.out.println(fibonacciRecursion(40)); long endTime1 = System.currentTimeMillis()-currentTime1; System.out.println("遞迴方式計算所需時間:"+endTime1); long currentTime2 = System.currentTimeMillis(); System.out.println(fibonacciNotRecursion(40)); long endTime2 = System.currentTimeMillis()-currentTime2; System.out.println("非遞迴方式計算所需時間:"+endTime2); } //典型的裴波那契數列,遞迴方式實現:F(n) = F(n-1) + F(n-2) public static long fibonacciRecursion(long day){ if(day == 0){ return 0; } if(day == 1){ return 1; } else { return fibonacciRecursion(day-1)+fibonacciRecursion(day-2); } } //非遞迴方式,思路:每次儲存上一次結果 public static long fibonacciNotRecursion(long day){ if(day == 0){ return 0; } if(day == 1){ return 1; } long temp1 = 1; long temp2 = 1; long end = 0; for(long i = 2;i <= day;i++){ end = temp1 + temp2; temp2 = temp1; temp1 = end; } return end; }