经典算法03--猴子吃桃
猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾就多吃了一个。第二天早上又将剩下的桃子吃了一半,还是不过瘾又多
吃了一个。以后每天都吃前一天剩下的一半再加一个。到第10天刚好剩一个。问猴子第一天摘了多少个桃子?
分析: 这是一套非常经典的算法题,这个题目体现了算法思想中的递推思想,递归有两种形式,顺推和逆推,针对递推,只要
我们找到递推公式,问题就迎刃而解了。
令S10=1,容易看出 S9=2(S10+1), 简化一下
S9=2S10+2
S8=2S9+2
.....
Sn=2Sn+1+2
遥想公瑾当年,老师说递归是最简洁,最容易理解的,好,就用递归试一下:
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 int sum = SumPeach(1); 6 7 Console.WriteLine("第一天摘得桃子有:{0}", sum); 8 9 Console.Read(); 10 } 11 12 //递归 13 static int SumPeach(int day) 14 { 15 if (day == 10) 16 return 1; 17 18 return 2 * SumPeach(day + 1) + 2; 19 } 20 }
当我们玩转递归的时候,老师说线性递归会将“变量,参数,返回值”在“递”的过程中压栈,如果迟迟“递”不到头的话,栈就会越积越多,
最后就爆掉了,window中系统默认的堆栈空间是1M。
那么解决方法是什么? 尾递归,下面我们继续上代码:
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 int sum = SumPeachTail(1, 1); 6 7 Console.WriteLine("第一天摘得桃子有:{0}", sum); 8 9 Console.Read(); 10 } 11 12 //尾递归 13 static int SumPeachTail(int day, int total) 14 { 15 if (day == 10) 16 return total; 17 18 //将当前的值计算出传递给下一层 19 return SumPeachTail(day + 1, 2 * total + 2); 20 } 21 }
那么两种递归有什么区别呢?上图说话。
从图中我们可以清晰的看到“线性递归”和“尾递归”的区别,那到底有什么本质区别呢?尾递归中在每次向下递归的过程中,都会将当前
层的结果计算出来后向下一层传递,从理论上说,传到下一层后,上一层的参数值已经没有存在的必要了,可以清除上一层中的变量占
用的栈空间,那么最终达到的效果就是永远不会出现StackOverflowException了,但实际上是否真有这个效果,得要看编译程序是否
真的给你优化了。
下面我们将day=10改成day=int.MaxValue,跑一下程序看看:
很可惜,有图有真相,抛出异常了,当然我是菜鸟,早已看不懂汇编了,大家也可以讨论讨论,目前我个人认为C#编译器没有给
我做这个优化:-D。
下一步我们就要计算一下这个递归的时间复杂度是多少,关于求“递归”的时间复杂度主要有三种:
1. 代换法。
2. 递归树法。
3. 主定理。
这一篇我就说下代换法,作法如下
①:猜一下递归式复杂度的上界或者下界。
②:用数学归纳法证明你的复杂度是正确的。
为了具有通用性,我们将“猴子吃桃”的问题反过来写,也就是已知S1,求S10,当然原理是一样的,通用公式就有如下形式:
Tn=2Tn-1+2 ①
假使 Tn=O(n) ②
则必定存在一个 c>0的自然数使
Tn<=cO(n)=cn ③
③代入①知
Tn<=2c(n-1)+2=2cn-2c+2
=cn-c+1
=cn-(c-1)
当c>=1时,则必有 Tn<=cn
最后得出递归式的时间复杂度为O(N)。
经典算法03--猴子吃桃相关推荐
- C++经典算法题-猴子吃桃问题
1. 题目 题目:一只猴子摘了N个桃子第一天吃了一半又多吃了一个,第二天又吃了余下的一半又多吃了一个,到第十天的时候发现还有一个. 2. 分析 3. 代码示例 /* 猴子吃桃问题 */main(){i ...
- 猴子吃桃问题 php,趣味算法:猴子吃桃问题
简明现代魔法 -> C/C++ -> 趣味算法:猴子吃桃问题 趣味算法:猴子吃桃问题 2010-05-26 猴子第一天摘下若干桃子,当即吃了一半,还不过瘾,又多吃了一个.第二天早上又将剩下 ...
- C语言经典习题之猴子吃桃问题
猴子吃桃问题: 猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个.以后每天早上都吃了前一天剩下的一半零一个.到第10天早上想再吃时,见只剩下 ...
- 87-Java方法递归形式、算法流程总结、递归常见案例、递归经典案例-猴子吃桃问题、非规律化递归案例-文件搜索、啤酒问题
方法递归 一.递归的形式和特点 1.什么是方法递归? 方法直接调用自己或者间接调用自己的形式称为方法递归(recursion). 递归作为一种算法在程序设计语言中广泛应用. 2.递归的形式 直接递归: ...
- 猴子吃桃问题:一只小猴子摘了若干桃子,每天吃现有桃的一半多一个,到第10天时就只有一个桃子了,求原有多少个桃?请编程实现。(C++)(迭代法)
算法经典题型14 猴子吃桃问题:一只小猴子摘了若干桃子,每天吃现有桃的一半多一个,到第10天时就只有一个桃子了,求原有多少个桃?请编程实现. 用到的思想-迭代法 博主用到的环境:Win7, CodeB ...
- Java递归算法——猴子吃桃
此博文由于笔者的疏忽,内容分析有问题,在此感谢评论区:WINorYU.熙·溯.ZStaoerA等大佬的指出,代码分析中,应该是先+1再乘2,本着记录错误的目的,问题代码就不做删除了,希望各位看此博文的 ...
- 经典算法题每日演练——第三题 猴子吃桃
猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾就多吃了一个.第二天早上又将剩下的桃子吃了一半,还是不过瘾又多 吃了一个.以后每天都吃前一天剩下的一半再加一个.到第10天刚好剩一个.问猴子第一天摘了多 ...
- 猴子吃桃的逆推c语言算法,经典算法题每日演练 猴子吃桃
猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾就多吃了一个.第二天早上又将剩下的桃子吃了一半,还是不过瘾又多 吃了一个.以后每天都吃前一天剩下的一半再加一个.到第10天刚好剩一个.问猴子第一天摘了多 ...
- 猴子吃桃c语言程序到第n天,猴子吃桃问题之《C语言经典案例分析》
猴子吃桃问题之<C语言经典案例分析> 一.[什么是猴子吃桃] 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个.第二天早上又将第一天剩下的桃子吃掉一半,有多吃了 ...
最新文章
- Ubuntu远程控制详细步骤流程
- 三、linux目录浏览管理及维护
- 数据结构:线性数据结构(1)-栈(栈,队列,deques, 列表)
- protected default
- 程序员面试金典 - 面试题 10.01. 合并排序的数组
- 拓端tecdat|R 语言绘制功能富集泡泡图
- Spring Boot 搭建 Eureka Servrer 单机模式、高可用模式
- 慕课网上socket课程的学习
- 京东商品详情数据接口(APP端,H5端),监控京东商品历史价格及价格走势,接口代码对接教程
- DMP (Dynamic Movement Primitives) 动态运动基元
- 逆向攻击破解安卓游戏
- 32款实用网页开发人员必备的谷歌浏览器扩展
- 解密编程——程序诞生的基本工序
- android 全景usb 全景,汽车360度全景USB高清数字信号输出系统的制作方法
- c#后端QQ通讯录(代码部分)
- 关于典型二阶系统固有频率
- 深入分析Android 9.0源代码——Activity启动流程
- 使用GrowPart工具完成对LVM逻辑卷的在线热扩容
- qemu qcow2镜像如何缩小
- 极品飞车9计算机中丢失,极品飞车9缺少d3dx9 极品飞车9丢失d3dx926.dll解决方法
热门文章
- Reinforcement Learning强化学习系列之二:MC prediction
- Allegro中设置Xnet等长
- Real-world Anomaly Detection in Surveillance Videos监控视频中的现实世界异常检测
- (模块化)Finding and evaluating community structure in net work
- 【精确延时函数】IAR(MSP430)中的精确延时函数
- 一起学python——红绿灯程序设计(1--4)代码
- html制作服装推广软文,服装设计网站用哪些软文推广工具才能实现全网营销
- Arduino溶氧仪
- 企业信使运营管理平台怎么使用
- 信息安全管理——对称加密