递归调用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),还是一个斐波拉契数列。
遇到的一个问题,按照之前的做法写了下面一段代码:
在测试的时候出现段错误,堆栈溢出。想想应该是递归调用层数太多引起的。我们知道在进行递归调用的时候,会先把当前的环境,变量都压入一个栈中保存起来,等到运行完毕后再从栈中取出原来的东西,继续往下操作。当递归操作太多的时候,可能会由于内存大小的限制造成一些错误的产生。改用如下的程序来求问题的解:
这个同样也是求的一个斐波拉契数列的最后一项的值,也就是本问题的解。
关于递归的很多问题还是有很多需要去理解。包括递归的层数的问题,递归的优缺点,递归对内存的需求影响,在递归中何时保存何值的问题等等。
思路:刚开始想的是和前面提到的青蛙跳的想法差不多,因为矩形可以横着放,也可以竖着放,对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; } };
这个同样也是求的一个斐波拉契数列的最后一项的值,也就是本问题的解。
关于递归的很多问题还是有很多需要去理解。包括递归的层数的问题,递归的优缺点,递归对内存的需求影响,在递归中何时保存何值的问题等等。
相关文章推荐
- 常见错误及解决方式
- 串口使用
- 智渔课堂官方免费教程三:Java基础之注释 关键字 标识符
- 一笔画问题 NYOJ
- Swift调用C代码的方法
- 103. Binary Tree Zigzag Level Order Traversal
- I学霸官方免费教程三:Java基础之注释 关键字 标识符
- 2015年7月份来的知识回顾
- 单元测试junit
- 说一说Android的工程目录结构
- VSTS负载测试——如何:使用 SQL 创建结果存储区
- Scala 深入浅出实战经典 第52讲:Scala中路径依赖代码实战详解
- c语言中 指针和一维数组 简要总结
- 栈 链表的实现
- 第一周工作总结及计划表
- gerrit H2 数据库管理
- sdnu 1087.过河(NOIP 2005 提高组)DP状态压缩
- CS224d Problem set 2作业
- 《R语言实战》读书笔记--第三章 图形初阶(二)
- 区间覆盖