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数所花费的时间。
程序代码:
package SF;
public class sy2_1_1 {
public static void main(String[] args) {
sy2_1_1 p = new sy2_1_1();
long time;
for(int n=45;n<=48;n++){
long start=System.currentTimeMillis();
p.fibonacci(n);
long end=System.currentTimeMillis();
time=end-start;
System.out.println("求第"+n+"个Fibonacci数所花费的时间为"+time+"ms");
}
}
int fibonacci(int n)
{
if (n <= 1) return 1;
return fibonacci(n-1)+fibonacci(n-2);
}
}
运行结果:
求第45个Fibonacci数所花费的时间为5020ms
求第46个Fibonacci数所花费的时间为7785ms
求第47个Fibonacci数所花费的时间为12588ms
求第48个Fibonacci数所花费的时间为22190ms
2.将递归函数改为尾递归,或者是递推函数,求第45,46,47,48个Fibonacci数所花费的时间,观察效率是否得到提高。
程序代码:
package SF;
public class sy2_1_2 {
public static void main(String[] args) {
int array[] = new int[50];
array[0]=array[1]=1;
long time;
for(int n=45;n<=48;n++){
long start=System.currentTimeMillis();
for(int j=2;j<n;j++){
array[j]=array[j-2]+array[j-1];
}
long end=System.currentTimeMillis();
time=end-start;
System.out.println("求第"+n+"个Fibonacci数所花费的时间为"+time+"ms");
}
}
}
运行结果:
求第45个Fibonacci数所花费的时间为0ms
求第46个Fibonacci数所花费的时间为0ms
求第47个Fibonacci数所花费的时间为0ms
求第48个Fibonacci数所花费的时间为0ms
效率提高!