一、题目描述
一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只,这样他经过7个村庄后还剩2只鸭子,问他出发时工赶多少只鸭子?
二、算法构造
1、递归算法
由题意可知,对于最后一个村子duck-(duck/2+1)=2,设此时为第0个村庄。由此,定义一个有一个变量的递归函数duck(v)。其中,v表示所经过的村庄数。函数的意义是到达第v个村庄所有的鸭子总数。容易得到下面的递归公式:
duck(v) = { duck(0) = 1 v=1
| duck(v)+duck(v-1)+duck(0) v>0 && v<=7
2、非递归算法
具体算法实现如图所示。
图2.2 赶鸭子非递归实现
三、算法实现
// 递归实现
int duck(int village){
if(village == 0){
return 2;
}
else if(village > 0){
return 2 * (duck(village - 1) + 1);
}
}
//在main()中输出每一个村庄卖出的鸭子数
for(i = 1; i <= 7; i++){
temp = ducks / 2 + 1;
printf("经过第 %d 个村庄卖出 %d 个鸭子。\n", i, temp);
ducks = ducks / 2 - 1;
}
// 非递归实现
int duck_un(int village,int sell){
int d = 2;
int temp = 0;
for(village; village > 0; village--){
temp = (d + 1) * 2;
printf("经过第 %d 个村庄卖出 %d 个鸭子。\n",village,temp-d);
d = (d + 1) * 2;
}
return temp;
}
四、调试、测试及运行
1、调试
(1)进入duck()函数,调用递归结束开始返回的各数据的值。
(2)duck()函数调用结束各数据的值。
(3)进入duck_un()函数,调用递归结束开始返回的各数据的值。
(4)duck_un()函数调用结束各数据的值。
2、测试
测试代码:
void test(int counts){
int i = 1;
for (; i <= 7; i++){
counts = counts / 2 - 1;
}
if (counts == 2){
printf("测试正确,最后剩余%d只鸭子。\n", counts);
}
else{
printf("测试结果错误!\n");
}
}
测试结果:
3、运行
五、总结
test()函数传参错误。
通过调试得知此时的ducks=2,应传入参数ducks1。