1. 程式人生 > >劍指offer:遞迴和迴圈系列問題解答

劍指offer:遞迴和迴圈系列問題解答

目錄

n<=39

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

n<=39

使用遞迴的方式如果數字較大會有很嚴重的效率問題!可以用二叉樹的方式表示這種依賴關係:(以9為例子)

不難發現,出現了很多重複節點,大大降低了運算效率!

class Solution {
public:
    int Fibonacci(int n) {
        if(n < 2)
            return n;
        int a = 0;
        int b = 0;
        int c = 1;
       for(int i = 1;i < n;i++)
       {
           a = b + c;
           b = c;
           c = a;
       }
        return a;

    }
};

一隻青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法(先後次序不同算不同的結果)。

class Solution {
public:
    int jumpFloor(int number) {
        if( number < 2 )
        {
            return 1;
        }
        return jumpFloor(number - 1) + jumpFloor(number - 2);
    }
};

如果把n級臺階看出是n的函式f(n),臺階數n>=2,第一次跳臺階就有兩種不同的選擇,1:第一次跳一階剩下的臺階數為f(n - 1),2:第一次跳兩階時剩下的臺階數為f(n - 2)。

因此總共的可能性為f(n) =  f(n - 1) + f(n - 2);不難看出這是一個斐波那契數列!

一隻青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。

分析如下:

f(1) = 1

f(2) = f(2-1) + f(2-2)      

f(3) = f(3-1) + f(3-2) + f(3-3) 

...

f(n-1) = f(n-2) + f(n-3) + ... + f(n-1-(n-1)) 

f(n) = f(n-1) + f(n-2) + f(n-3) + ... + f(n-(n-1)) + f(n-n) 

所以可以推出:f(n) = f(n-1) + f(n-1) =f(n-1) * 2

class Solution {
public:
    int jumpFloorII(int number) {
        if(number < 2)
            return number;
        return jumpFloorII(number - 1) * 2;
    }
};

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

class Solution {
public:
    int rectCover(int number) {
     if(number <= 2)  
        return number;
        return rectCover(number -1) + rectCover(number -2);
    }
};

設n個矩形為f(n),如果第一個豎著放時剩下的為f(7),如果第一個橫著放是為f(6),剩下的可能性為f(n) = f(n -1) + f(n -2)