猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,就只剩一个桃子了。编程求第一天共摘了多少桃子。
得到的条件是最后一天还剩下一个,第九天等于第十天 + 1 再乘以 2,第八天等于第九天 + 1乘以 2,以此类推。递归必须要有终止条件,此问题的终止条件为 第十天返回 1 ,也就是 n == 10 时,return 1,而第九天的数量可以表示为 (n+1)*2 ,此时n为第八天也就是 monEatPea(n+1), 所以得到最终的递归循环为 (monEatPea(n+1)+1)*2,得到递归的方法为(加上约束):
public int monEatPea(int n){
if(n == 10){
return 1;
}else if(n >= 1 && n <= 9){
return (monEatPea(n+1)+1)*2;
}else{
return -1;
}
}
上面这种写法可以计算一到十天任一一天的剩的桃子数字,如果题中没有给出第十天还剩 1 颗桃子,可以采用另外一种逆向思维,就是最后一天剩下一颗,即 n == 1时,return 1,该写法只要求天数大于0即可,输入的是天的总数,第一天有的桃子。
public int monEatPea(int n){
if(n == 1){
return 1;
}else if(n > 1){
return (monEatPea(n-1)+1)*2;
}else{
return -1;
}
}
mian函数测试代码为:
public class demo18{
public static void main(String[] args) {
monkey m = new monkey();
int sum = 0;
sum = m.monEatPea(1);
if(sum == -1){
System.out.println("输入有误!");
}else{
System.out.println(sum);
}
}
}
class monkey{
public int monEatPea(int n){
if( n == 10){
return 1;
}else if(n >= 1 && n <=9){
return (monEatPea(n+1)+1)*2;
}else{
return -1;
}
}
}
第一种测试截图为:
第二种main方法测试为:
public class demo18{
public static void main(String[] args) {
monkey m = new monkey();
int sum = 0;
sum = m.monEatPea(10);
if(sum == -1){
System.out.println("输入有误!");
}else{
System.out.println(sum);
}
}
}
class monkey{
public int monEatPea(int n){
if( n == 1){
return 1;
}else if(n > 1){
return (monEatPea(n-1)+1)*2;
}else{
return -1;
}
}
}
第二种测试截图为:



