Fibonacci数列
无穷数列1,1,2,3,5,8,13,21,34,55,……,称为Fibonacci数列。它可以递归地定义为:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mfsZSW9z-1639391007775)(C:\Users\86152\AppData\Roaming\Typora\typora-user-images\image-20211212181754705.png)]
第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数所花费的时间,观察效率是否得到提高。
public class Fibonacci_series {//Fibonacci数列
public static void main(String args[]){
int n = 47,N = 47;
long start = 0;
long end = 0;
System.out.println("递归函数求Fibonacci");
while(n <53){
start = System.currentTimeMillis();
System.out.println(fibonacci(n));
end = System.currentTimeMillis();
System.out.printf("第%d个Fibonacci数所花的时间%d毫秒\n",n,(end - start));
n++;
}
System.out.println("--------------------------------------------------------------");
System.out.println("递推函数求Fibonacci");
while(N < 53){
start = System.currentTimeMillis();
System.out.println(fibonacci2(N));
end = System.currentTimeMillis();
System.out.printf("第%d个Fibonacci数所花的时间%d毫秒\n",N,(end - start));
N++;
}
}
public static long fibonacci(int n){//递归求Fibonacci
if(n <= 1) return 1;
return fibonacci(n - 1) + fibonacci(n - 2);
}
public static long fibonacci2(int n){
if(n < 1){return 0;}
else if(n == 1 || n == 2){return 1;}
long m1 = 1,m2 = 2,m3 = 0;
for(int i = 3;i <= n;i++){
m3 = m1 + m2;
m1 = m2;
m2 = m3;
}
return m3;
}
}