猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾就多吃了一个。第二天早上又将剩下的桃子吃了一半,还是不过瘾又多

吃了一个。以后每天都吃前一天剩下的一半再加一个。到第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--猴子吃桃相关推荐

  1. C++经典算法题-猴子吃桃问题

    1. 题目 题目:一只猴子摘了N个桃子第一天吃了一半又多吃了一个,第二天又吃了余下的一半又多吃了一个,到第十天的时候发现还有一个. 2. 分析 3. 代码示例 /* 猴子吃桃问题 */main(){i ...

  2. 猴子吃桃问题 php,趣味算法:猴子吃桃问题

    简明现代魔法 -> C/C++ -> 趣味算法:猴子吃桃问题 趣味算法:猴子吃桃问题 2010-05-26 猴子第一天摘下若干桃子,当即吃了一半,还不过瘾,又多吃了一个.第二天早上又将剩下 ...

  3. C语言经典习题之猴子吃桃问题

    猴子吃桃问题: 猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个.以后每天早上都吃了前一天剩下的一半零一个.到第10天早上想再吃时,见只剩下 ...

  4. 87-Java方法递归形式、算法流程总结、递归常见案例、递归经典案例-猴子吃桃问题、非规律化递归案例-文件搜索、啤酒问题

    方法递归 一.递归的形式和特点 1.什么是方法递归? 方法直接调用自己或者间接调用自己的形式称为方法递归(recursion). 递归作为一种算法在程序设计语言中广泛应用. 2.递归的形式 直接递归: ...

  5. 猴子吃桃问题:一只小猴子摘了若干桃子,每天吃现有桃的一半多一个,到第10天时就只有一个桃子了,求原有多少个桃?请编程实现。(C++)(迭代法)

    算法经典题型14 猴子吃桃问题:一只小猴子摘了若干桃子,每天吃现有桃的一半多一个,到第10天时就只有一个桃子了,求原有多少个桃?请编程实现. 用到的思想-迭代法 博主用到的环境:Win7, CodeB ...

  6. Java递归算法——猴子吃桃

    此博文由于笔者的疏忽,内容分析有问题,在此感谢评论区:WINorYU.熙·溯.ZStaoerA等大佬的指出,代码分析中,应该是先+1再乘2,本着记录错误的目的,问题代码就不做删除了,希望各位看此博文的 ...

  7. 经典算法题每日演练——第三题 猴子吃桃

    猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾就多吃了一个.第二天早上又将剩下的桃子吃了一半,还是不过瘾又多 吃了一个.以后每天都吃前一天剩下的一半再加一个.到第10天刚好剩一个.问猴子第一天摘了多 ...

  8. 猴子吃桃的逆推c语言算法,经典算法题每日演练 猴子吃桃

    猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾就多吃了一个.第二天早上又将剩下的桃子吃了一半,还是不过瘾又多 吃了一个.以后每天都吃前一天剩下的一半再加一个.到第10天刚好剩一个.问猴子第一天摘了多 ...

  9. 猴子吃桃c语言程序到第n天,猴子吃桃问题之《C语言经典案例分析》

    猴子吃桃问题之<C语言经典案例分析> 一.[什么是猴子吃桃] 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个.第二天早上又将第一天剩下的桃子吃掉一半,有多吃了 ...

最新文章

  1. Ubuntu远程控制详细步骤流程
  2. 三、linux目录浏览管理及维护
  3. 数据结构:线性数据结构(1)-栈(栈,队列,deques, 列表)
  4. protected default
  5. 程序员面试金典 - 面试题 10.01. 合并排序的数组
  6. 拓端tecdat|R 语言绘制功能富集泡泡图
  7. Spring Boot 搭建 Eureka Servrer 单机模式、高可用模式
  8. 慕课网上socket课程的学习
  9. 京东商品详情数据接口(APP端,H5端),监控京东商品历史价格及价格走势,接口代码对接教程
  10. DMP (Dynamic Movement Primitives) 动态运动基元
  11. 逆向攻击破解安卓游戏
  12. 32款实用网页开发人员必备的谷歌浏览器扩展
  13. 解密编程——程序诞生的基本工序
  14. android 全景usb 全景,汽车360度全景USB高清数字信号输出系统的制作方法
  15. c#后端QQ通讯录(代码部分)
  16. 关于典型二阶系统固有频率
  17. 深入分析Android 9.0源代码——Activity启动流程
  18. 使用GrowPart工具完成对LVM逻辑卷的在线热扩容
  19. qemu qcow2镜像如何缩小
  20. 极品飞车9计算机中丢失,极品飞车9缺少d3dx9 极品飞车9丢失d3dx926.dll解决方法

热门文章

  1. Reinforcement Learning强化学习系列之二:MC prediction
  2. Allegro中设置Xnet等长
  3. Real-world Anomaly Detection in Surveillance Videos监控视频中的现实世界异常检测
  4. (模块化)Finding and evaluating community structure in net work
  5. 【精确延时函数】IAR(MSP430)中的精确延时函数
  6. 一起学python——红绿灯程序设计(1--4)代码
  7. html制作服装推广软文,服装设计网站用哪些软文推广工具才能实现全网营销
  8. Arduino溶氧仪
  9. 企业信使运营管理平台怎么使用
  10. 信息安全管理——对称加密