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