猴子在第一天摘了若干个桃子,吃了一半后,不过瘾,又吃了一个。第二天又吃了剩下桃子的一半加1个。到第10天的时候,桃子还剩一个(第10天没有吃)。
问猴子最开始摘了多少个桃子?
这道题一看就是递归,且递推公式为:
K(n-1)/2 -1 = K(n)
但有意思的是结束条件是第10天而不是第1天,不符合一般递推应用”将复杂问题简单化“的理念。所以需要把题目转换一下:
假设猴子第一天摘了一个桃子,然后以某种规律继续摘,求第10天一共摘了多少桃子。
至于这个规律就是将上述公式变为K(n)/2 -1 = K(n-1),变化后得到:K(n)=(K(n)+1)*2.
public class Testing {
public static void main(String[] args) {
System.out.print(doTower(10));
}
private static int doTower(int n) {
int i;
if(n == 1){
i = 1;
}else{
i = doTower(n-1)*2+2; -- 由于结束条件是第一天,因此递归公式应该从n归约到1,因此应该是n-1。
}
return i;
}
}
或者直接用第10天作为接受条件也是可以的:
public class Testing {
public static void main(String[] args) {
System.out.print(doTower(1));
}
private static int doTower(int n) {
int i;
if(n == 10){
i = 1;
}else{
i = doTower(n+1)*2+2; -- 由于结束条件是10,因此递归公式是从1递增到n,因此是n+1.
}
return i;
}
}