=========================================================================
001、【题目】猴子吃桃问题
猴子吃桃问题:猴子第一天吃了若干个桃子,当即吃了一半,还不解馋,又多吃了一个; 第二天,吃剩下的桃子的一半,还不过瘾,又多吃了一个;以后每天都吃前一天剩下的一半多一个,到第10天想再吃时,只剩下一个桃子了。问第一天共吃了多少个桃子?
【程序分析】:
思路一:采取逆向思维的方法,从后往前推断。第10天剩一个,前一天则为d9 = (d10 +1)*2,以此推算前一天。可以采用递归如下:
Day10--------------------------1
Day9-------------------------- 4
Day8------------------------- 10
Day7-------------------------22
Day6-------------------------46
Day5-------------------------94
Day4-------------------------190
Day3-------------------------382
Day2-------------------------766
Day1-------------------------1534
思路二:采取逆向思维的方法,从后往前推断。第10天剩一个,前一天则为d9 = (d10 +1)*2,以此推算前一天。可以采用递归函数如下:
假设n为天数,n从1开始,getTao为求桃子的递归函数,按照规律总结公式如下:
getTao(n) == (getTao(n+1) + 1) * 2
当n == 10的时候,桃子数为1
【程序源码】:
/*********************************************
运行平台:Windows 10专业版
开发工具:Dev-C++
编程语言:C语言
整理作者:物联网牛七七
修改日期:2022年12月15日
**********************************************/
【思路一】
#include <stdio.h>
int main(int argc, char *argv[])
{
int day;
int x1, x2; /* x1表示前一天,x2表示后一天 */
x2 = 1; /* 第10天,剩下一个 */
for(day=9;day>=1;day--) /* 从第9天开始递推到第1天 */
{
/* x2表示后一天的桃子数 */
x1 = (x2 + 1) * 2;
x2 = x1;
}
printf("\n\n猴子第一天共计摘下:%d个桃子\n\n", x1);
return 0;
}
【思路二】
#include<stdio.h>
int getTao(int n)
{
if(n == 10)
{
return 1;
}
return (getTao(n+1) + 1) * 2;
}
int main()
{
int res = getTao(1);
printf("%d",res);
return 0;
}
【运行效果】: