赶鸭子

一、题目描述

一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只,这样他经过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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值