您的位置:首页 > 其它

递归调用2

2015-08-09 19:26 232 查看
问题:我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

思路:刚开始想的是和前面提到的青蛙跳的想法差不多,因为矩形可以横着放,也可以竖着放,对n从1开始区分情况:

不严格的说横着放和竖着放有时候是一种情况,也就是说




这里(1)和(2)是两种方法,而不是说(1)旋转后就和(2)一样了。

n=1时,有1种放置方法;

n=2时,有2种放置方法;

n=3时,有3中放置方法;

。。。

这样就得到了f(n)=f(n-1)+f(n-2),还是一个斐波拉契数列。

遇到的一个问题,按照之前的做法写了下面一段代码:

[code]class Solution {
public:
    int rectCover(int number) {
        if (number < 0)
            cout << "ERROR!" << endl;
        if (number == 1)
            return 1;
        if (number == 2)
            return 2;
        else
            return rectCover(number-1)+rectCover(number-2);
    }
};


在测试的时候出现段错误,堆栈溢出。想想应该是递归调用层数太多引起的。我们知道在进行递归调用的时候,会先把当前的环境,变量都压入一个栈中保存起来,等到运行完毕后再从栈中取出原来的东西,继续往下操作。当递归操作太多的时候,可能会由于内存大小的限制造成一些错误的产生。改用如下的程序来求问题的解:

[code]class Solution {
public:
    int rectCover(int number) {
        int value0 = 0, value1 = 1;
        int temp;
        while (number-- > 0) {
            temp = value1;
            value1 += value0;
            value0 = temp;
        }
        return value1;
    }
};


这个同样也是求的一个斐波拉契数列的最后一项的值,也就是本问题的解。

关于递归的很多问题还是有很多需要去理解。包括递归的层数的问题,递归的优缺点,递归对内存的需求影响,在递归中何时保存何值的问题等等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: