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

吃了一个。以后每天都吃前一天剩下的一半再加一个。到第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)。

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

  1. 【C】C语言之经典算法:河内之塔(1)

    文章目录 前言 一.背景 二.思路解析 三.流程图解析 四.代码附上 五.结果 六.参考链接 [C]C语言之经典算法:河内之塔(1) 前言 博主开通了C语言算法专栏,旨在对于有关C语言的一些经典算法的 ...

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

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

  3. C语言/Python经典算法冒泡排序

    C语言经典算法冒泡排序 #include "stdio.h" int main(){int a[10]={1,3,2,5,9,7,6,8,4,0};for (int i = 0; ...

  4. C语言(经典编程题:报数游戏)

    题目描述 有n个人围成一圈,顺序排号.从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位. 题目分析 这便是整体的题目流程,大家围成一个圈,愉快的报着数,报到3的 ...

  5. C语言中经典算法——斐波那契数列的几种算法

    斐波那契数列的递推公式: 我们尝试计算斐波那契数列的第n项并输出. 1.递归法 #include<stdio.h> int fib(int m) {if(m>=3){return f ...

  6. C语言面试经典编程题

    C语言简单冒泡排序法: #include <stdio.h> int main(void) {int a[] ={900,2,3,888,1000};int n;int i;int j;i ...

  7. 第39级台阶回溯算法c语言,五大经典算法之回溯法 - osc_9ipdey7e的个人空间 - OSCHINA - 中文开源技术交流社区...

    一.基本概念 回溯法,又称为试探法,按选优条件向前不断搜索,以达到目标.但是当探索到某一步时,如果发现原先选择并不优或达不到目标,就会退回一步重新选择,这种达不到目的就退回再走的算法称为回溯法. 与穷 ...

  8. 海盗分金c语言算法,[经典算法]海盗分金问题sql求解(贪心算法)

    问题: 经济学上有个"海盗分金"模型:是说5个海盗抢得100枚金币,他们按抽签的顺序依次提方案:首先由1号提出分配方案,然后5人表决,超过半数同意方案才被通过,否则他将被扔入大海喂 ...

  9. 【C语言】经典编程题

    文章目录 1. Fibonacci数列 ⭐️ 2. 替换空格

最新文章

  1. mac怎么用c语言写文件路径,Mac 中使用os模块更改文件路径
  2. android 8.0手机无法更新版本,安卓手机升级安卓8.0后 系统以后可能都无法回退
  3. MyBatis 配置文件 用户密码加密存储
  4. 计算机实训教学论文,计算机实训教学探索论文
  5. 如何给一家公司做定性研究?
  6. python有趣小程序-你用python写过那些好玩的微信小程序?
  7. Kafka Consumer API示例
  8. 如何下载高分辨率卫星影像
  9. APP开发:教你从零开始制作一个APP
  10. html中支持透明图片的格式,IE6 png图片透明的解决方法教程
  11. mysql数据库存储引擎
  12. 居家办公的团队协作模式改进思考
  13. android 延时拍照,手机如何延时拍摄 手机延时拍摄技巧有哪些
  14. Dijkstra算法的思想
  15. C语言单元测试框架——CUnit
  16. visio 为保存卡死找回文件
  17. python实时读取日志_paramiko使用tail实时获取服务器的日志输出详解
  18. 手写Spring DI依赖注入,嘿,你的益达!
  19. ERP IPQC是什么意思 IPQC工作职责和IPQC工作流程
  20. 如何调整html中音乐播放器的大小,HTML5音乐播放器(三):播放进度,时间显示以及音量的调节...

热门文章

  1. Mac解压Rar,7z,Zip,Winrar?Mac解压缩软件测评,推荐Mac上免费好用的解压软件,高效解压神器帮您解决苹果电脑的解压缩问题
  2. 搭建本地Spring Initializr服务(2020/4/17)
  3. 机器学习(1):绪论
  4. 图形性能测试软件,跨平台图形性能基准测试软件3DMark Wild Life发布
  5. 矢量绘图软件:Sketch 56 for mac
  6. Echarts双Y轴,右侧Y轴标签不显示
  7. 傻瓜式IOS发布教程(一)iTunes Connect创建应用以及内购
  8. 添加 “Microsoft Word 97 - 2003 文档” 右键功能菜单
  9. 小米8se刷android7系统,小米8SE Flyme8系统刷机包(系统刷机最新固件升级包)
  10. 数据分析,怎么做才能有前瞻性