递归实现买汽水,汽水1元一瓶,2个空瓶可换一瓶汽水

例如:20元,是可买38瓶汽水吗? 38=20+10+5+2+1
答案是否定的,应该是39瓶
5瓶元的时候余下一个空瓶,1瓶的时候又余下一个空瓶,所以又可以换一瓶
总之奇数瓶的时候就会余下一个空瓶

其实这个问题有一个简单的解法,这个问题是数学中典型的数列问题,
直接利用数学公式推导可得 买汽水数=(钱数)*2-1即可得正确答案,但这样
对与我们提升编程能力来说没有营养价值,所以我决定用递归这种方法来求解

其他思路:
一元可买一瓶汽水,即两个空瓶价值一元,所以应该以买汽水的钱(money)作为递归的变化条件,函数参数money每次除以二,递归结束条件money==1时
难点是如何保存余下的空瓶,并当空瓶积累到2个时,可以换一瓶汽水,并又保存新产生的一个空瓶
,之后我会在程序注释中做详细解释

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
buyWater(int money, int count,int remain) {
	//如果没钱,则返回零
	if (money == 0) {
		return 0;
	}
	//用remain来保存汽水数为奇数时剩下的哪一个瓶子
	if (money % 2 == 1) {
		remain = remain + 1;
		//每当remain积累到2时又可换一瓶汽水count++
		//而这一瓶子也不能换一瓶汽水
		//所以又余下一个瓶子,所以remain只需减1
		if (remain == 2) {
			count++;
			remain--;
		}
	}
	if (money ==1) {
		return count + 1;
	}
		count = money + count;
		return buyWater(money / 2, count,remain);
}
int main() {
	int money = 0, count = 0,remain=0;
	printf("你有多少钱用来买汽水:\n");
	scanf("%d", &money);
	int number = buyWater(money, count,remain);
	printf("你可以买:%d瓶汽水\n", number);
	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值