Fibonacci數列-遞推、遞迴
阿新 • • 發佈:2018-12-12
Fibonacci數列
無窮數列1,1,2,3,5,8,13,21,34,55,……,稱為Fibonacci數列。它可以遞迴地定義為:
第n個Fibonacci數可遞迴地計算如下:
int fibonacci(int n)
{
if (n <= 1) return 1;
return fibonacci(n-1)+fibonacci(n-2);
}
- 編寫完整的主函式,分別記錄利用上述遞迴函式求第45,46,47,48個Fibonacci數所花費的時間。
程式程式碼:
package SF; public class sy2_1_1 { public static void main(String[] args) { sy2_1_1 p = new sy2_1_1(); long time; for(int n=45;n<=48;n++){ long start=System.currentTimeMillis(); p.fibonacci(n); long end=System.currentTimeMillis(); time=end-start; System.out.println("求第"+n+"個Fibonacci數所花費的時間為"+time+"ms"); } } int fibonacci(int n) { if (n <= 1) return 1; return fibonacci(n-1)+fibonacci(n-2); } }
執行結果:
求第45個Fibonacci數所花費的時間為5020ms 求第46個Fibonacci數所花費的時間為7785ms 求第47個Fibonacci數所花費的時間為12588ms 求第48個Fibonacci數所花費的時間為22190ms
2.將遞迴函式改為尾遞迴,或者是遞推函式,求第45,46,47,48個Fibonacci數所花費的時間,觀察效率是否得到提高。
程式程式碼:
package SF; public class sy2_1_2 { public static void main(String[] args) { int array[] = new int[50]; array[0]=array[1]=1; long time; for(int n=45;n<=48;n++){ long start=System.currentTimeMillis(); for(int j=2;j<n;j++){ array[j]=array[j-2]+array[j-1]; } long end=System.currentTimeMillis(); time=end-start; System.out.println("求第"+n+"個Fibonacci數所花費的時間為"+time+"ms"); } } }
執行結果:
求第45個Fibonacci數所花費的時間為0ms 求第46個Fibonacci數所花費的時間為0ms 求第47個Fibonacci數所花費的時間為0ms 求第48個Fibonacci數所花費的時間為0ms
效率提高!