python猴子偷桃编程_浏览某仁兄的 Java经典编程 猴子偷桃问题 自己的一点看法...

原帖地址在http://www.iteye.com/topic/679770,其中的猴子偷桃问题的的解法, 楼主用的是递归,有另外一位朋友提出了一个更简单的方法,由于自己也有点爱数学,所以提出了另外一种解法,当然是用的数学的方式。效率确实比原帖中的两位朋友的效率都高一些些。

看原帖:

楼主的作品: 思路清晰,很好理解。

package com.sailor.game;

/**

* 题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第二天早上又将剩

* 下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。

* 程序分析:采取逆向思维的方法,从后往前推断。

*

* @author Sailor

*

*/

public class Monkey_Peach {

public static void main(String[] args) {

int[] peach = new int[10];

peach[9] = 1;

// 下面利用的是数组和循环将每天的桃子数量都求出来了

for (int i = peach.length - 1; i > 0; i--) {

peach[i - 1] = 2 * (peach[i] + 1);

}

for (int i = 0; i < peach.length; i++) {

System.out.println(peach[i]);

}

System.out.println("第一天的桃子数:"+getPeach_Num(10, 1));

}

// 利用递归的方法来求第一天的桃子数,输入参数为天数和当天的桃子数,输出为第一天桃子数

public static int getPeach_Num(int day, int peach_num) {

if (day == 1)

return peach_num;

else if (day < 1 || peach_num < 0)

return 0;

else

return getPeach_Num(day - 1, (peach_num + 1) * 2);

}

}

一位朋友的回答,把复杂问题简单化了,也很好理解

因为到第10天只有一个桃子了,我们就可以这么理解了,假设今天还有x个桃子,那么他前一天的应该是(x+1)*2,那么直接使用

int x = 1;

for(int i=9;i>0;i--){

x = (x+1) * 2;

}

System.out.println(x);

就可以计算到你的结果。

然后是我自己的解法:

public static long getPeach_Num3(int day){

return 3*(1<

}

说下我的解题思路:(注意: 楼主和那位朋友的解法都是从第2天发现桃子还剩1个开始计算的, 所以就不考虑第一天吃后就发现只剩1个的情况了。)

于是就有了程序里面的3*(1<

然后写了段代码,比较了一下性能(顺便说一句,这个编辑器对数学公式支持不好):

天数

耗时结果

备注

5

楼主的

316339

46

朋友的

118943

46

我的

105935

46

由此可见,我的方法效率要高一点点(计算30的时候要高出一个数量级),但是最多计算30天的时候(因为用的是移位算法,所以越位了),那位朋友的可以计算到第31天。

10

楼主的

376814

1534

朋友的

135666

1534

我的

109340

1534

15

楼主的

314625

49150

朋友的

149601

49150

我的

120337

49150

20

楼主的

304700

1572862

朋友的

135371

1572862

我的

123151

1572862

30

楼主的

325140

1610612734

朋友的

2917332

1610612734

我的

123089

1610612734

31

楼主的

348122

-1073741826

朋友的

142802

3221225470

我的

132409

-1073741826

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值