劍指offer--循環遞歸

四道題:

1、Fibonacci數列;

class Solution {
public:
    int Fibonacci(int n) {
        if(n<=1)
            return n==0?0:1;
        int op1=0,op2=1;
        int res=0;
        for(int i=2;i<=n;++i)
        {
            res=op1+op2;
            op1=op2;
            op2=res;
        }
        return res;
    }
};

2、青蛙跳:一次1節或2節;

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

class Solution {
public:
    int jumpFloor(int number) {
        //number=1,1種跳法
        //number=2,2中跳法;一次跳一階,一次跳兩階
        //number=n:分兩種情況。第一次跳一階,還有f(n-1)種;第一次跳兩階,還有f(n-2)種。
        if(number<=2)
            return number==1?1:2;
        int op1=1;
        int op2=2;
        int res=0;
        for(int i=3;i<=number;++i)
        {
            res=op1+op2;
            op1=op2;
            op2=res;
        }
        return res;
    }
};

3、變態青蛙跳:一次1節或2節或…或n節;

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

class Solution {
public:
    int jumpFloorII(int number) {
        //number=1;f(1)=1
        //number=2;f(2)=2
        //number=3;f(3)=f(1)+f(2)+1
        //number=n;f(n)=f(1)+f(2)+....+f(n-1)+1

        //f(n)=2^(n-1)

        int res=1;
        for(int i=1;i<number;++i)
        {
            res*=2;
        }
        return res;
    }
};

4、矩形覆蓋:

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

class Solution {
public:
    int rectCover(int number) {
        //仍舊是fibonacci問題
        if(number<=2)
            return (number<=1)?(number==1?1:0):2;
        int op1=1;
        int op2=2;
        int res=0;
        for(int i=3;i<=number;++i)
        {
            res=op1+op2;
            op1=op2;
            op2=res;        
        }
        return res;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章