今天在网上看到这个问题,比较有意思,记下。
猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少?
采取逆向思维的方法,从后往前推断。
分析:
第10天:1个
第9天:4个
第8天:10个
……………….
第1天:X个
也就是说,要知道第一天的个数,就得知道第二天的个数,依此类推,就需要从最后一天即第10天开始计算,也就是倒推,看样子用递归算法比较简单。
private int process(int day) {
if(day == 10) {
return 1;
}
day = (day > 10 || day < 1) ? 10 : day;//这行为可选,只是为了使示例代码更灵活健壮
return (process(day + 1) + 1) * 2;
}
或者可以更简短:
private int process(int day) {
return (day == 10) ? 1 : (process(day + 1) + 1) * 2;//不考虑day > 10 || day < 1的情况
}
看到也有人不用递归,想想也可以,写了另一段代码:
int amount = 1;//最后一天剩余数
for(int day = 10 ; day > 0 ; day–) {
amount = (day == 10) ? 1 : (amount + 1) * 2;
}
当然也可以更简短:
int amount = 1;//最后一天剩余数
for(int day = 9 ; day > 0 ; day–) {
amount = (amount + 1) * 2;
}




