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数所花费的时间。
import java.text.DateFormat;
import java.util.Date;
import java.util.Scanner;
public class fib {
private static Scanner in;
public static void main(String[] args) {
in = new Scanner(System.in);
int n=in.nextInt();
Date date=new Date();
DateFormat df=DateFormat.getDateTimeInstance();
System.out.println(df.format(date));
new fib();
System.out.println("相加的结果为:"+fibonacci(n));
Date date1=new Date();
System.out.println(df.format(date1));
long fib=(date1.getTime()-date.getTime())/1000;
System.out.println("当n为"+n+"时,计算所需要的时间差为:"+fib+"秒");
}
static int fibonacci(int n){
if(n<=1)
return 1;
else
return fibonacci(n-1)+fibonacci(n-2);
}
}
2、将递归函数改为尾递归,或者是递推函数,求第45,46,47,48个Fibonacci数所花费的时间,观察效率是否得到提高。
尾递归的方法,相对于递归的方法,运算会快一点。
import java.text.DateFormat;
import java.util.Date;
import java.util.Scanner;
public class fib {
private static Scanner in;
public static void main(String[] args) {
in = new Scanner(System.in);
int n=in.nextInt();
Date date=new Date();
DateFormat df=DateFormat.getDateTimeInstance();
System.out.println(df.format(date));
new fib();
System.out.println("相加的结果为:"+fibonacci(n, n, n));
Date date1=new Date();
System.out.println(df.format(date1));
long fib=(date1.getTime()-date.getTime())/1000;
System.out.println("当n为"+n+"时,计算所需要的时间差为:"+fib+"秒");
}
static int fibonacci(int n, int ret1, int ret2){
if (n ==0 )
return ret1;
else
return fibonacci(n - 1, ret2, ret1 +ret2);
}
}