斐波那契数

f(0)=0
f(1)=1
f(n) = f(n-1)+f(n-2)  //n>=2

递归法

时间复杂度: O(2^n),效率极其低下

int f(int n){
   //check n >=0
   if(n==0) return 0;
   if(n==1) return 1;

   return f(n-1)+f(n-2); 
}

正推法

一次求取 f(0),f(1),f(2),f(3),...,f(n)

时间复杂度为: O(n)

int f(int n){
    // check n>=0
    if(n==0) return 0;
    if(n==1) return 1;

    int[] arr = new array[n+1];
    arr[0]=0;
    arr[1]=1;
    for(int i=2;i<=n;i++){
        arr[i]=arr[i-1] + arr[i-2];
    }
    return arr[n];
}

上面还可以进行优化,没必要设置数组大小为n+1,只需要3个就可以了;

优化后的代码:

int f(int n){
    //check n >=0
    if(n==0) return 0;
    if(n==1) return 1;

    int[] arr=new arr[3];
    arr[0]=0;
    arr[1]=1;

    for(int i=2;i<=n;i++){
        t=i%3;
        t1=(i-1)%3;
        t2=(i-2)%3;
        arr[t]=arr[t1] + arr[t2];
    }
    return arr[n%3];
}

打表法

提前算好结果:

result[0]=0
result[1]=1
result[2]=1
result[3]=2
result[4]=3
result[5]=4
...

时间复杂度为:O(1)