递归调用2

问题:我们可以用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),还是一个斐波拉契数列。
遇到的一个问题,按照之前的做法写了下面一段代码:

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);
    }
};

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

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;
    }
};

这个同样也是求的一个斐波拉契数列的最后一项的值,也就是本问题的解。
关于递归的很多问题还是有很多需要去理解。包括递归的层数的问题,递归的优缺点,递归对内存的需求影响,在递归中何时保存何值的问题等等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值