猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第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;}}}
第二种测试截图为: