1. 程式人生 > >Fibonacci數列-遞推、遞迴

Fibonacci數列-遞推、遞迴

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);

   }

  1. 編寫完整的主函式,分別記錄利用上述遞迴函式求第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  

效率提高!