/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package Test;
import java.util.Scanner;
/**
*
* @author Administrator
*/
public class Fibonacci {
static long arr[];
private static void arrBuild(int n) {
arr = new long[n+1];
arr[0]=0;
arr[1]=1;
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
//解法一 根据斐波那契数列的公式递归求值,效率低
long begin_1 = System.currentTimeMillis();
int num1 = fibonacci1(n);
long end_1 =System.currentTimeMillis();
long l1 = end_1-begin_1;
System.out.println("num1="+num1+"耗时:"+l1);
//解法二 不用递归求
long begin_2 = System.currentTimeMillis();
long num2 = fibonacci2(n);
long end_2 =System.currentTimeMillis();
long l2 = end_2-begin_2;
System.out.println("num2="+num2+"耗时:"+l2);
//解法三 空间换时间,把已经算出来的值存在数组中
arrBuild(n);
long begin_3 = System.currentTimeMillis();
long num3 = fibonacci3(n);
long end_3 =System.currentTimeMillis();
long l3 = end_3-begin_3;
System.out.println("num3="+num3+"耗时:"+l3);
}
private static int fibonacci1(int n) {
if(n ==0)
return 0;
if(n==1)
return 1;
else
return fibonacci1(n-1)+fibonacci1(n-2);
}
private static long fibonacci2(int n) {
if(n ==0)
return 0;
if(n ==1)
return 1;
long a =1;
long b=0;
while(n>=2){
long tmp=a;
a=a+b;
b=tmp;
n--;
}
return a;
}
private static long fibonacci3(int n) {
if(arr[n]!=0||n==0)
return arr[n];
else
arr[n]=fibonacci3(n-1)+fibonacci3(n-2);
return arr[n];
}
}
还没看懂分治法。。。。
也没懂2.8懂了补上。。。好伤心