1. 程式人生 > >Java遞迴發實現Fibonacci數列,尾遞迴實現Fibonacci數列,並獲取計算所需時間

Java遞迴發實現Fibonacci數列,尾遞迴實現Fibonacci數列,並獲取計算所需時間

遞迴法計算Fibonacci數列:

它可以遞迴地定義為:

第n個Fibonacci數列可遞迴地計算如下:

int fibonacci(int n)

   {

       if (n <= 1) return 1;

       return fibonacci(n-1)+fibonacci(n-2);

   }

以下這個原始碼可以計算出遞迴法實現Fibonacci數列時,n為45、46、47、48時所需的時間。

import java.text.DateFormat;

import java.util.Date;

import java.util.Scanner;

public class time {

public static void main(String[] args) {

Date date=new Date();

DateFormat df=DateFormat.getDateTimeInstance();

System.out.println(df.format(date));

Scanner in=new Scanner(System.in);

int n=in.nextInt();

time a=new time();

a.Fib(n);

System.out.println("相加的結果為:"+Fib

(n));

Date date1=new Date();

System.out.println(df.format(date1));

long time=(date1.getTime()-date.getTime())/1000;

System.out.println("當n為"+n+"時,計算所需要的時間差為:"+time+"秒");

}

public static int Fib(int n){

if(n<=1) return 1;

return Fib(n-1)+Fib(n-2);

}

}

可以看到,遞迴法所需要的時間還是很久的,因為計算F(n)時,需首先計算F(n-1)和F(n-2)

,而在計算F(n-1)時已經算過F(n-2)了,但是遞迴演算法看不到這點,所以產生這麼多假髮,所需時間也就多了,效率就下降了。

尾遞迴:

尾遞迴比遞迴函式效率高太多了,尾遞迴就是把當前的運算結果(或路徑)放在引數裡傳給下層函式。而不是把下層函式的運算結果用來本次的計算。尾遞迴是極其重要的,不用尾遞迴,函式的堆疊耗用難以估量,需要儲存很多中間函式的堆疊,而遞迴每一次計算出來的部分結果,在下一次迴圈時還需要再計算一遍。

import java.text.DateFormat;

import java.util.Date;

import java.util.Scanner;

public class time {

public static void main(String[] args) {

Date date=new Date();

DateFormat df=DateFormat.getDateTimeInstance();

Scanner in=new Scanner(System.in);

int n=in.nextInt();

time a=new time();

a.Fib(n);

System.out.println("相加的結果為:"+Fib(n));

Date date1=new Date();

long time=(date1.getTime()-date.getTime())/1000;

System.out.println("當n為"+n+"時,計算所需要的時間差為:"+time+"秒");

}

public static int Fib(int n){

if(n<2) return n;

return Fibo(n,1,1,3);

}

public static int Fibo(int n,int r1,int r2,int begin){

if(n==begin) return r1+r2;

return Fibo(n,r2,r1+r2,++begin);

}

}