Fibonacci数列-递推、递归

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

   }

  1. 编写完整的主函数,分别记录利用上述递归函数求第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
 

效率提高!

猜你喜欢

转载自blog.csdn.net/qq_40956679/article/details/82901649