1.一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?
代码:
#include<stdio.h>
int circ(int);
int main()
{
int all, v, sum;
all = circ(7);
printf("总共有%d只鸭鸭。\n",all);
for(v = 0; v < 7; v++)
{
sum = all / 2 + 1;
printf("第%d个村,卖了%d只鸭鸭。\n", v + 1, sum);
all = all / 2 - 1;
}
return 0;
}
int circ(int i)
{
if(i == 0)
{
return 2;
}
else
{
i = 2*( circ(i - 1) +1);
return i;
}
}
用递归前,首先要把问题数学化:每次经过村子都卖出一半又一只,式子:从第七个村的2只开始倒推回去,不断地加一再乘以2,直到倒推到第一个村。这样的过程就是递归。
程序实现的时候需要注意的是:递归是在函数里面调用函数,一般是需要用题目里面的某一个数值来控制函数自己调用自己的次数。
在本题目中,明显能作为次数调用的是村子的个数,从第七个村子开始,倒推回来直到回到第一个村子,也就是当调用到第七次的时候停止继续调用。
所以参数我们选择的是村子的数量,第七个村子开始往回算,每次都是加一再乘以2,
所以是2*(circ(i-1)+1),记得是当村子还没回到第一个村子的时候继续调用,当回到第一个村子的时候就立即也就是当i-1=0的时候返回值变为返回一个2,这样一来就构成了一个完整的递归函数。