劍指offer第二版面試題10:斐波那契數列(JAVA版)

題目:寫一個函數,輸入n,求斐波那契數列的第n項。斐波那契數列的定義以下:面試

一、效率很低效的解法,挑剔的面試官不會喜歡函數

使用遞歸實現:spa

public class Fibonacci {
    public long getNum(int n){
        if(n<=0){
            return 0;
        }else if(n==1){
            return 1;
        }else{
            return getNum(n-1)+getNum(n-2);
        }
    }
}

 

咱們不難發如今這顆樹中有不少的節點是重複的,並且重複的節點數會隨着n的增大而急劇增長,這意味着計算量會隨着n的增大而急劇增大。事實上,用遞歸的方法計算的時間複雜度是以n的指數的方式遞增的。讀者不妨求Fibonacci的第100項試試,感覺一下這樣的遞歸會慢到什麼程度。code

 

二、面試官期待的適用解法:blog

其實改進的方法並不複雜,將計算出來的中間項保存起來,減小計算次數遞歸

 

public class Fibonacci2 {
    public long getNum(int n){
        if(n==0){
            return 0;
        }
        if(n==1){
            return 1;
        }
        int temp1=0;//第n-2項的值
        int temp2=1;//第n-1項的值
        int result=0;//保存中間計算出來的結果
        for(int i=2;i<=n;i++){
            result=temp1+temp2;
            temp1=temp2;
            temp2=result;
        }
        return result;
    }
}
相關文章
相關標籤/搜索