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

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

经典算法题每日演练——第三题 猴子吃桃相关推荐

  1. 经典算法题每日演练——第六题 协同推荐SlopeOne 算法

    原文:经典算法题每日演练--第六题 协同推荐SlopeOne 算法 相信大家对如下的Category都很熟悉,很多网站都有类似如下的功能,"商品推荐","猜你喜欢&quo ...

  2. 经典算法题每日演练——第七题 KMP算法

    原文:经典算法题每日演练--第七题 KMP算法 在大学的时候,应该在数据结构里面都看过kmp算法吧,不知道有多少老师对该算法是一笔带过的,至少我们以前是的, 确实kmp算法还是有点饶人的,如果说红黑树 ...

  3. 经典算法题每日演练——第十题 树状数组

    原文:经典算法题每日演练--第十题 树状数组 有一种数据结构是神奇的,神秘的,它展现了位运算与数组结合的神奇魅力,太牛逼的,它就是树状数组,这种数据结构不是神人是发现不了的. 一:概序 假如我现在有个 ...

  4. 经典算法题每日演练——第五题 字符串相似度

    原文地址:http://www.cnblogs.com/huangxincheng/archive/2012/11/11/2765633.html 这篇我们看看最长公共子序列的另一个版本,求字符串相似 ...

  5. 经典算法题每日演练——第十一题 Bitmap算法

    在所有具有性能优化的数据结构中,我想大家使用最多的就是hash表,是的,在具有定位查找上具有O(1)的常量时间,多么的简洁优美, 但是在特定的场合下: ①:对10亿个不重复的整数进行排序. ②:找出1 ...

  6. 经典算法题每日演练——第二十一题 十字链表

    上一篇我们看了矩阵的顺序存储,这篇我们再看看一种链式存储方法"十字链表",当然目的都是一样,压缩空间. 一:概念 既然要用链表节点来模拟矩阵中的非零元素,肯定需要如下5个元素(ro ...

  7. 经典算法题每日演练——第二十二题 奇偶排序

    原文:经典算法题每日演练--第二十二题 奇偶排序 这个专题因为各种原因好久没有继续下去了,MM吧...你懂的,嘿嘿,不过还得继续写下去,好长时间不写,有些东西有点生疏了, 这篇就从简单一点的一个&qu ...

  8. 经典算法题每日演练——第十九题 双端队列

    经典算法题每日演练--第十九题 双端队列 原文:经典算法题每日演练--第十九题 双端队列 话说大学的时候老师说妹子比工作重要~,工作可以再换,妹子这个...所以...这两个月也就一直忙着Fall in ...

  9. 经典算法题每日演练——第一题 百钱买百鸡

    经典算法题每日演练--第一题 百钱买百鸡 原文:经典算法题每日演练--第一题 百钱买百鸡 百钱买百鸡的问题算是一套非常经典的不定方程的问题,题目很简单:公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱, ...

最新文章

  1. 加密解密php,PHP实现的加密解密处理类
  2. Java编程详细解析—淘宝大秒杀系统是如何设计的?
  3. 如何优化移动端的网站排名?
  4. FCKeditor在线文本编辑器初级应用
  5. Q1全球智能机销量增长3.9% 三星苹果华为居三甲
  6. CSU1323: ZZY and his little friends
  7. k8s核心技术-Helm(chart模板的使用下)---K8S_Google工作笔记0049
  8. 解决@ResponseBody注解返回的json中文乱码问题
  9. 三、K8s常见操作命令
  10. 有关人工智能发展历史及未来前景的论文
  11. “铭赛科技”科创板IPO:“机器人王国梦”价值几何?
  12. EasyCaptcha图形验证码工具
  13. 以太网没有有效的ip怎么解决
  14. 耳机的危害有多严重?哪种耳机对耳朵伤害小?
  15. 十二、适配器模式——解决充电的烦恼 #和设计模式一起旅行#
  16. 微软开源在线代码编辑器,编辑器天花板之Monaco Editor
  17. USB会议摄像机的重要的网络特性
  18. 廊坊金彩教育:拼多多场景推广是什么
  19. 【新手提问导读】提问的艺术_提问的艺术
  20. google colab自动断连咋办?

热门文章

  1. python的类的super()
  2. Ubuntu 16.04设置Redis为开机自动启动服务
  3. (三)数字判断大小语句
  4. 把整个DIV变成超链接
  5. 关于把程序添加到打开方式的解决办法
  6. lucene源代码学习之 lucene的经典打分过程
  7. Ubuntu常用命令与技巧
  8. www.yzcode.com Flash广告下载,自己利用从此网站下载的Flash广告制作了自己第一个广告...
  9. 盛趣游戏 html5游戏,盛趣游戏谭雁峰:游戏破局的“精细”时代已来
  10. Cocos 2d-X Lua 游戏添加苹果内购(二) OC和Lua交互代码详解