剑指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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章