我们先来看看问题:
猴子第一天摘下N个桃子,当时就吃了一半,还不过瘾,就又多吃了一个。第二天又将剩下的桃子吃掉一半,又多吃了一个。以后每天都吃前一天剩下的一半零一个。到第10天在想吃的时候就剩一个桃子了,问第一天共摘下来多少个桃子?并反向打印每天所剩桃子数。
根据题意,我们假设猴子第n天吃的桃子数是num个,则当n=10,num=1.反推得到:n=9——num=(1+1)*2=4;n=8——num=(4+1)*2=10 ; ······
所以我们将考虑编写一个函数,若n=10,则num=1;否则n一遍遍代回。
普通循环方式为
#include<stdio.h>
int main()
{
int day=9,x1=0,x2=1;
for(;day>0;day--)
{
x1=(x2+1)*2;
x2=x1;
}
printf("The first day of picking peaches number is:%d\n",x1);
}
采用递归方法,注意返还值的巧妙运用。
#include <stdio.h>
int sumPeach(int day)
{
if (day == 10)
return 1;
else
return 2 * sumPeach(day + 1) + 2;
}
int main()
{
int sum;
sum=sumPeach(1);
printf("The first day of picking peaches number is:%d\n",sum);
}
题目条件要求我们将反向打印每天剩余的桃子数,所以
#include <stdio.h>
int getPeachNumber(int n)
{
int num;
if(n == 10)
{
return 1;
}
else
{
num = (getPeachNumber(n+1)+1)*2;
printf("第%d天所剩桃子%d个\n",n,num);
}
return num;
}
int main()
{
int num = getPeachNumber(1);
printf("猴子第一天摘了:%d个桃子。\n",num);
return 0;
}