问题:有一只猴子,第一天摘了若干个桃子 ,当即吃了一半,但还觉得不过瘾 ,就又多吃了一个。第2天早上又将剩下的桃子吃掉一半,还是觉得不过瘾,就又多吃了两个。以后每天早上都吃了前一天剩下的一半加天数个(例如,第5天吃了前一天剩下的一半加5个)。到第n天早上再想吃的时候,就只剩下一个桃子了。
代码:
public class W03_16_02猴子吃桃问题 {
/**
* 递归法
* 根据第几天剩余一个桃子获得第一天的桃子数(即:桃子初始数)
* @param day 第多少天
* @param days 第多少天剩余一个桃子
* @return 第多少天的桃子数
*/
public static int getPeachNum(int day,int days){
if(day == days) {
return 1;
}else {
return (getPeachNum(day+1,days)+day)*2;
}
}
/**
* 递推法
* 根据第几天剩余一个桃子获得每天的桃子数
* @param days 第多少天剩余一个桃子
* @return 每天的桃子数,数组表示(数组中下标为几即代表第几天的桃子数)
*/
public static int[] getPeachNum(int days){
int[] peachNum = new int[days+1];
peachNum[days] = 1;
peachNum[0]=0;
//数组中下标为几即代表第几天的桃子数,故最后一天剩余1个桃子,第0天为0个桃子
for(int i = days-1; i>0; i--){
peachNum[i] = (peachNum[i+1]+i)*2;
//每一天的桃子数应该为后一天的桃子数加上多吃的桃子数的和的两倍
}
return peachNum;
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.printf("请输入第几天只剩一个桃子:");
int days = scan.nextInt();
if(days <= 0){
System.out.printf("输入错误!");
return;
}//排除输入错误
int[] peachNum = getPeachNum(days);
System.out.printf("根据递推法,桃子总共有%d个!\n", peachNum[1]);
System.out.printf("根据递归法,桃子总共有%d个!\n", getPeachNum(1,days));
}
}