遞歸算法--斐波那契數列

大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項爲0)。n<=39

很容易我們想到使用遞歸求解:

public class Solution {
    public int Fibonacci(int n) {
        if(n == 0)
            return 0;
        if(n == 1)
            return 1;
        return Fibonacci(n-2) + Fibonacci(n-1);
    }
}

當n比較大時,可以明顯感覺算法運行速度比較慢,這是由於上述返回代碼中使用了兩層遞歸,使用遞歸的思想是好的,但是這裏我們可以用迭代明顯改善算法運行效率,用空間換時間:

public class Solution {
    public int Fibonacci(int n) {
        if(n < 2)
            return n;
        int f = 0, g = 1;
        int result = 0;
        for(int i = 1; i < n; i++){
            result = f + g;
            f = g;
            g = result;
        }
        return result;
    }
}

問題變形

我們可以用2*1的小矩形橫着或者豎着去覆蓋更大的矩形。請問用n個2*1的小矩形無重疊地覆蓋一個2*n的大矩形,總共有多少種方法?

分析

這裏寫圖片描述
對於n步操作,可以分兩種情況討論:
1. 第一步這樣覆蓋
這裏寫圖片描述
那麼f(n) = f(n-1);
2. 第一步這麼覆蓋
這裏寫圖片描述
那麼下一步只有可能這麼覆蓋
這裏寫圖片描述
那麼f(n) = f(n-2)
所以f(n) = f(n-1) + f(n-2)

public class Solution {
    public int RectCover(int target) {
      if(target  <= 1){
            return 1;
        }
        if(target*2 == 2){
            return 1;
        }else if(target*2 == 4){
            return 2;
        }else{
            return RectCover((target-1))+RectCover(target-2);
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章