题目描述:无穷数列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.编写完整的主函数,分别记录利用上述递归函数求第47, 48, 49, 50, 51, 52个Fibonacci数所花费的时间。
2.将递归函数改为尾递归,或者是递推函数,求第47, 48, 49, 50, 51,52个Fibonacci数所花费的时间,观察效率是否得到提高。
首先用递归法解决,代码如下
package 算法设计与分析;
import java.util.Scanner;
public class K2_1 {
public static void main(String[] args) {
long starTime=System.currentTimeMillis();
Scanner in = new Scanner(System.in);
long a = in.nextInt();//输入要求的第x个数
System.out.println(Fibonacci(a));
in.close();
long endTime = System.currentTimeMillis();
System.out.println("程序消耗时间:"+(endTime-starTime)+"ms");//程序运行的时间
}
public static long Fibonacci(long n) {
if (n==1)
return 1;
if (n==2)
return 1;
else
return Fibonacci(n-1)+Fibonacci(n-2);
}
}
用尾递归解决,代码如下
package 算法设计与分析;
import java.util.Scanner;
public class K2_2 {
public static void main(String[] args) {
long starTime=System.currentTimeMillis();
Scanner in = new Scanner(System.in);
long a = in.nextInt();//输入要求的第x个数
System.out.println(FibonacciTail(a,0,1));//0,1是指数列开头的两项非递归项
in.close();
long endTime = System.currentTimeMillis();
System.out.println("程序消耗时间:"+(endTime-starTime)+"ms");//输出程序运行时间
}
public static long FibonacciTail(long a,long t1,long t2)//尾递归
{
if(a==0)
return t1;
return FibonacciTail(a-1,t2,t1+t2);
}
}
用尾递归法解决效率确实得到了提升。这与递归,尾递归之间的运算顺序有关。本文暂不对两者进行研究了,想了解的可以查查资料,后续也可能会更新相关知识。
递归与尾递归的简单比较
学习中,欢迎交流,指导