此博文由于笔者的疏忽,内容分析有问题,在此感谢评论区:WINorYU、熙·溯、ZStaoerA等大佬的指出,代码分析中,应该是先+1再乘2,本着记录错误的目的,问题代码就不做删除了,希望各位看此博文的同学以笔者为戒
在此为看过这篇博文的同学道个歉,笔者不严谨导致误导了各位同学,以后笔者的博文在发布前,一定反复查验!!!
偶然看到一个算法问题——猴子吃桃
题目如下:
. 猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个.第二天早上又将剩下的桃子吃掉一半,又多吃了一个.以后每天早上都吃了前一天剩下的一半零一个.到第十天早上在想吃时,就只剩一个桃子了.求第一天共摘了多少个桃子?
分析:
设一共有n个桃子,每过一天猴子吃 n/2-1 个桃子,在第十天的时候,n = 1
根据递推公式 当第十天n=1时,那么第九天为:1*2+1 = 3,第八天为:3*2+1 = 7 ... 第一天为:n*2+1
由上诉条件分析我们可以得出程序:
// 问题代码
public static int monkey(int day){
// 当天数为第十天时,还剩一个桃子
if (day == 10){
return 1;
}
// 否则根据公式递推 应该是先+1再乘2 此处代码问题未做修复
return monkey(day+1)*2+1;
}
// 修复代码
public static int monkey(int day){
// 当天数为第十天时,还剩一个桃子
if (day == 10){
return 1;
}
return (monkey(day+1)+1)*2;
}
返回结果:
通过传入天数1可以得出 第一天猴子共摘了1023个桃子
由于不确定返回的结果是否正确,笔者写了一个验证程序
// 定义全局变量 记录天数 问题代码
private static int day = 0;
public static int mk(int total){
System.out.println("第"+(++day)+"天,桃子数量为:"+total);
// 当桃子为1时,返回的天数是第10天
if (total== 1){
return 10;
}
// 猴子一天会吃前一天剩下桃子总数的一半多一个
return mk(total/2)-1;
}
// 修复代码
public static int mk(int total){
System.out.println("第"+(++day)+"天,桃子数量为:"+total);
// 当桃子为1时,返回的天数是第10天
if (total == 1){
return 10;
}
// 猴子一天会吃前一天剩下桃子总数的一半多一个
return mk((total/2)-1);
}
返回结果如下:
{\__/} {\__/}
( ·-·) (·-· )
/ >------------------------------------------------< \
| ☆ |
| ☆ |
| ★ |
| ☆ |
| ☆ |
| |
-------------------------------------