问题描述:
猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾就多吃了一个。第二天早上又将剩下的桃子吃了一半,还是不过瘾又多吃了一个。以后每天都吃前一天剩下的一半再加一个。到第10天刚好剩一个。问猴子第一天摘了多少个桃子?
分析:
这是一套非常经典的算法题,这个题目体现了算法思想中的递推思想,递归有两种形式,顺推和逆推,针对递推,只要
我们找到递推公式,问题就迎刃而解了。
令S10=1,容易看出 S9=2(S10+1), 简化一下
S9=2S10+2
S8=2S9+2
.....
Sn=2Sn+1+2
遥想公瑾当年,老师说递归是最简洁,最容易理解的,好,就用递归试一下:
public static void main(String[] args) throws IOException {
int sum = a(1);
int s = b(1, 1);
System.out.println("sum:" + sum);
System.out.println("s:" + s);
}
private static int b(int i, int j) {
if (i == 10) {
return j;
}
return b(i + 1, 2 * j + 2);
}
public static int a(int day) {
if (day == 10) {
return 1;
}
return 2 * a(day + 1) + 2;
}
这样就用顺序递归和尾递归完成了计算。