猴子第一天摘了许多个桃子,先吃了所有桃子的一半,后又吃了一个;第二天又吃了剩下桃子的一半,后又吃了一个……第十天,剩1个桃子。问:猴子第一天摘了多少个桃子?

首先对“猴子吃桃”的过程进行正向推导,设:猴子第一天摘了N个桃子,第n天剩Ln个桃子。则——

L1 = N/2 - 1

L2 = L1/2 - 1/2 - 1

L3 = L2/2 - 1/2^2 - 1

......

Ln = L(n-1)/2 - 1;

然后对“猴子吐桃”的过程进行逆向推导,因为Ln = L(n-1)/2 - 1,所以L(n-1) = 2Ln + 2。即——

从某一天剩余的桃子量我们可以逆推出上一天的桃子量。可以想象猴子把当天吃的桃子吐了出来(先吐出一个,再吐出目前桃子数2倍的桃子),就是上一天吃剩下的桃子量。

由于我们已经知道了第10天猴子吃完桃后剩余桃子数为1,这样就可以把“第10天”和“1个桃”作为两个参数传入一个“猴子吐桃”的函数中,让猴子把吃的桃儿都吐出来,一直吐到第1天,并返回第一天猴子摘的桃子数:

using System;

namespace MonkeyEatPeaches
{
class Program
{
static void Main(string[] args)
{
int left = ;
int days = ;
Console.WriteLine(MonkeyVomitPeaches(days, left));
Console.ReadKey();
} private static int MonkeyVomitPeaches(int days, int left)
{
if (days > )
{
left = (left + ) * ;
days--;
return MonkeyVomitPeaches(days, left);
}
else
{
return (left + ) * ;
}
}
}
}

结果得出:

答:第一天猴子摘了3070个桃子。

其实这个递归法就相当于一个for循环,所以时间复杂度为O(n)。

可以进一步研究一下递归算法的时间复杂度

C#之猴子吃桃儿问题的解法——猴子吐桃儿的更多相关文章

  1. 猴子吃桃儿问题(C#)

    猴子第一天摘了许多个桃子,先吃了所有桃子的一半,后又吃了一个:第二天又吃了剩下桃子的一半,后又吃了一个……第十天,剩1个桃子.问:猴子第一天摘了多少个桃子? 本程序对其做了修改,天数和吃一半后又吃了一 ...

  2. 猴子吃桃问题(南阳ACM324)

    猴子吃桃问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:0 描述 有一堆桃子不知数目,猴子第一天吃掉一半,又多吃了一个,第二天照此方法,吃掉剩下桃子的一半又多一个,天天如此, ...

  3. 猴子吃桃问题(Java递归实现)

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

  4. ocrosoft 程序设计提高期末复习问题M 递归求猴子吃桃

    http://acm.ocrosoft.com/problem.php?cid=1172&pid=12 题目描述 猴子吃桃问题.猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个. ...

  5. C语言中猴子吃桃问题

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

  6. Java50道经典习题-程序17 猴子吃桃问题

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

  7. java语言描述 猴子吃桃问题(递归和循环写法)

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

  8. 用Java编程计算猴子吃桃问题

    猴子吃桃问题:猴子吃桃子问题:猴子第一天摘下N个桃子,当时就吃了一半,还不过瘾,就又吃了一个.第二天又将剩下的桃子吃掉一半,又多吃了一个.以后每天都吃前一天剩下的一半零一个.到第10天在想吃的时候就剩 ...

  9. JAVA 基础编程练习题17 【程序 17 猴子吃桃问题】

    17 [程序 17 猴子吃桃问题] 题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第二天早上又 将剩下的桃子吃掉一半,又多吃了一个.以后每天早上都吃了前一天剩下的一 ...

随机推荐

  1. java-语法

    JAVA语法 1.标识符 1.定义:对各种变量.方法.类等进行命名的字符序列 2.规则:他的组成由字母.数字.$,数字不能出现在开始,不能和关键字重复,区分大小写 2.数据类型 1.分类 1基本数据类 ...

  2. SQL order 排序

    select * from emp;

  3. something about css locating.

    CSS position:static:默认属性,静态定位relative:相对定位,相对于父元素的定位,需要配合top,left,right,bottom,z-index等属性absolute:绝对 ...

  4. CSS_03_04_CSS伪元素选择器

    第01步:编写css代码:wei.css @charset "utf-8"; /* 伪元素选择器 :状态 效果顺序:L V H A */ a:link.lin_01{/*超链接,未 ...

  5. xsd与xsl文件的区别

    请问xsd与xsl文件的区别在哪里呢?   我刚学xml,一开始用xmlspy学的,然后生成了一个xsd的文件,但在网上下的源程序是有一个xsl文件的,很不明之间有什么区别的,为什么别人的程序不用xs ...

  6. paper 85:机器统计学习方法——CART, Bagging, Random Forest, Boosting

    本文从统计学角度讲解了CART(Classification And Regression Tree), Bagging(bootstrap aggregation), Random Forest B ...

  7. oracle的簇的管理

    使用ALTER修改簇属性(必须拥有ALTER ANY CLUSTER的权限) 1.修改簇属性 可以修改的簇属性包括: * PCTFREE.PCTUSED.INITRANS.MAXTRANS.STORA ...

  8. 【sinatra】设置默认的端口

    加入 set :port, 8888 #默认4567

  9. RAID、软RAID和硬RAID

    RAID(redundant array of inexpensive disks):独立的硬盘冗余阵列,基本思想是把多个小硬盘组合在一起成为一个磁盘组,通过软件或硬件的管理达到性能提升或容量增大或增 ...

  10. hadoop自带例子wordcount的具体运行步骤

    1.在hadoop所在目录“usr/local”下创建一个文件夹input root@ubuntu:/usr/local# mkdir input 2.在文件夹input中创建两个文本文件file1. ...