剑指offer--循环递归

来源:互联网 发布:电影产业 知乎 编辑:程序博客网 时间:2024/06/06 09:31

四道题:

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;    }};
0 0
原创粉丝点击