题目:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
分析:采用逆向思维,从后往前推。已知第十天有1个桃子,第九天吃了一半加一个桃子,可以推出第九天还有 (1 + 1)* 2个桃子,再依次往前推,最终可推出第一天猴子摘了多少桃子。
第一种方法:用循环的方式,给出第十天的桃子数,从第九天开始依次加一乘二直到第一天。
实现代码:
int num = 1;
int day = 10;
System.out.println("第" + day + "天有桃子:" + num);
for (day = 9; day >= 1; day--) {
num = 2 * (num + 1);
System.out.println("第" + day + "天有桃子:" + num);
}
System.out.println("猴子在第1天摘了" + num + "个桃子");
第二种方法:用递归方式。从第一天开始推算,当天数等于十时返回第十天的桃子数,否则返回后一天的桃子数。
实现代码:
public static void main(String[] args) {
int nowDay = 10; //已知第nowDay天
int num = 1;//有num个桃子
int day = 1;//求第day天有的桃子数
System.out.println("猴子在第1天摘了" + total(day, nowDay, num) + "个桃子");
}
public static int total(int day, int nowDay, int num){
int sum;
if (nowDay == day) {
System.out.println("第" + day + "天有桃子:" + num);
return num;
} else {
sum = (total(day + 1, nowDay, num) + 1) * 2;
}
System.out.println("第" + day + "天有桃子:" + sum);
return sum;
}
运行结果:
第10天有桃子:1
第9天有桃子:4
第8天有桃子:10
第7天有桃子:22
第6天有桃子:46
第5天有桃子:94
第4天有桃子:190
第3天有桃子:382
第2天有桃子:766
第1天有桃子:1534
猴子在第1天摘了1534个桃子
以下内容纯属吐槽,与正文内容无关,只图一乐(这类题做好几道了,实在是有点忍不住了):
你们看啊,这猴子在第一天摘了1534个桃子,当即吃了一半,也就是吃了767个了,还不过瘾,767个......竟然还不过瘾~w(゚Д゚)w????它是在哪装这么多的桃的,它是怎么吃下去的!!!!还说不过瘾又吃了一个Σ(っ °Д °;)っ。之后到第九天的时候,桃子还有4个,按照之前说的,它在第九天就吃了3个桃子.........第一天吃了768个——第九天只吃了3个,它是怎么做到的o_o ....按照它第一天的饭量之后不会饿的吗(⊙ˍ⊙)