博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php猴子吃桃问题代码,java递归:猴子吃桃问题
阅读量:4362 次
发布时间:2019-06-07

本文共 1231 字,大约阅读时间需要 4 分钟。

3b9aea41e25c26f7c9088dc342b45356.png

不少混java的亲们都曾经遇到过这样一道面试题:有一只猴子,它有一树桃子。猴子每天吃掉树上桃子数量的一半,不过瘾,又多吃一个。到了第十天,树上只剩下一个桃子。问:最开始树上有多少桃子?(要求采用递归的思想解决)。

拿到这类问题,我们该怎样思考呢?

昨天我们一起研究了斐波那契数列,我们已经有了一些概念。在昨天的问题中,我们先是找到了一个公式用来表达每天出生的兔子的数量,这个公式不断的拆解自身,直到拆解到第三天,从而达到了递归的跳出条件,结束了循环调用,得到结果。

同理,我们今天的问题还是采用一样的思路,所谓一招鲜,吃遍天。闲言少叙,先上代码:

76f3587310bf74e7459e3a084f151a84.png

大家可以看到,我在代码中已经写明了解题步骤:

找到一个函数,这个函数能够表达数列中任意两个连续数的关系

找到递归调用过程中,函数跳出递归的条件

第一条:找到一个表达数列中任意两个连续数的关系的函数,也就是公式。我们以前读书的时候,经常有做这样的练习,相信这一点难不倒大家。假设第一天树上的桃子为“x”个。猴子吃了一般,就是x/2。然后又多吃一个,所以第二天开始时,树上桃子的个数等于第一天猴子吃完以后,桃子剩下的个数,等于x/2-1。定义第y天猴子没吃之前,桃子的个数f(y),那么y+1天时,猴子没吃之前,桃子个数为f(y+1)。由此我们得到:

f(y)=x;

f(y+1)=x/2-1;

假定y=1(第一天),则f(y)=f(1)=x个桃子,回到问题:要得到第一天桃子个数,我们只需要求出x得值即可!

那么由“f(y+1)=x/2-1”可以得到“f(y)=x=(f(y+1)+1)*2”。

这个公式已经出来了。第一步的工作已完成。(第一步找公式只是个数学题。)

接下来,我们来进行第二步:找出递归跳出条件。

读题可知,第十天,树上桃子还剩一个,y代表天数,即第十天时:y=10。所以第十天的f(y)=f(10)=1;那么递归地跳出条件就是f(10)。【通过公式f(y)=(f(y+1)+1)*2依次转化f(1)到f(2)、f(3)……】

到这里,相信大家都明白了,代码中的m(int i)就是我们的函数f(y)。方法m中只需要传入天数就能得到该天的桃子个数。

private int m(int i) {

if (i==10) {

return 1;

} else {

int i1 = (m(i + 1) + 1) * 2;

return i1;

代码解读:方法m中传入天数i,方法体中判断如果i==10,返回第十天桃子个数1。否则:执行公式 (m(i + 1) + 1) * 2来计算第i天的桃子个数。(见上面推导的公式:f(y)=x=(f(y+1)+1)*2)。这样,在m(i)执行时,只要i不等于10,就会执行该公式,从而执行m(i+1)。这里就执行了方法的递归调用。每一次执行m(i+1),m中的入参都会加一,知道m(10)时,返回1。此时方法不再自己调用自己了。从而得到一个明确的结果。

cd7e6686109bffa7367d46d4714ae073.png

#程序员#

转载地址:http://bhkfs.baihongyu.com/

你可能感兴趣的文章
selenium动作链
查看>>
敏捷外包工程系列之二:人员结构(敏捷外包工程,敏捷开发,产品负责人,客户价值)...
查看>>
《设计你的人生》的部分经典语录
查看>>
mustache多次渲染和多个赋值
查看>>
《Flutter 实战》开源电子书
查看>>
Python 键盘记录
查看>>
HDU 1381 Crazy Search
查看>>
PLSQL
查看>>
修改计算机名
查看>>
Android-Activity的启动模式
查看>>
禅道项目管理系统整合Selenium IDE的思路
查看>>
Web 前端开发精华文章推荐(HTML5、CSS3、jQuery)【系列二十三】
查看>>
linux-nohup命令
查看>>
[LeetCode OJ] Roman to Integer
查看>>
三次握手和四次挥手
查看>>
Redis的简单动态字符串实现
查看>>
putty network error:software caused connection abort
查看>>
存储过程 <3> 和函数的区别
查看>>
高级service之ipc ADIL用法
查看>>
Django框架-基础篇
查看>>