利用循环与递归解决喝汽水问题

文章介绍了使用循环和递归的方法解决一个关于金钱购买汽水和用空瓶换取汽水的问题,最终得出喝的汽水总数公式。作者通过实例和代码展示了如何用编程实现这一过程。

问题描述

喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少汽水。

问题分析

假设有5块钱,那么可以买5瓶饮料。所以至少可以和5瓶,至少有5个空瓶子。

5个空瓶子拿出4个换两瓶汽水,剩下1个空瓶。喝完换来的两瓶汽水,这时已经喝了(5+2)瓶汽水,产生的2个空瓶加上是剩余的1个空瓶,一共有3个空瓶。3个空瓶可以换1瓶汽水,剩下1个空瓶,这时共喝了(5+2+1)瓶汽水,产生的1个空瓶加上剩余的1个空瓶,共2个空瓶,正好可以换1瓶汽水,此时一共喝了(5+2+1+1)= 9 瓶汽水。


循环方式解决

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

//喝汽水问题
int main()
{
	int monny = 0;//一瓶一块钱
	int empty = 0;//空瓶数
	int total = 0;//总共和的汽水总数

	printf("请输入你有多少钱:");
	scanf("%d", &monny);

	total = monny;//有多少钱就可以买多少瓶
	empty = monny;//买了多少瓶就会产生多少个空瓶

	while (empty > 1)
	{
		total = total + empty / 2;//目前喝的汽水总数=已经喝的+空瓶换来的
		empty = empty / 2 + empty % 2;//空瓶数=空瓶换来的汽水+剩余的(empty可能为奇数)
	}

	printf("%d", total);

	return 0;
}


 

基于循环总结规律

下面我们再继续输入几组数据 ,看看规律如何。

5块钱--------9瓶

7块钱--------13瓶

20块钱------39瓶

……

推出:喝的汽水总数= 2 * monny - 1

基于这个规律,我们可用更简单的代码来解决这个问题。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int Count(int monny);

int main()
{
	int monny = 0;
	printf("请输入你有多少钱:");
	scanf("%d", &monny);
	int ret = Count(monny);
	printf("%d", ret);

	return 0;
}

int Count(int monny)
{
	return 2 * monny - 1;
}

 递归方法解决

基于空瓶数的递归,也就是说,用递归算出空瓶数可以换几瓶汽水,再加上用钱买到的汽水瓶数即可。

基于空瓶数的代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int Count(int empty);

int main()
{
	int monny = 0;
	printf("请输入你有多少钱:");
	scanf("%d", &monny);
	int ret = Count(monny);
	printf("%d", ret + monny);//注意,需要加上monny

	return 0;
}

int Count( int empty)
{
	if (empty > 1)//说明可以换汽水
		return empty / 2 + Count(empty / 2 + empty % 2);
	else
		return 0;
}

//empty / 2 --> 用空瓶换来的汽水数
//empty % 2 --> 空瓶数可能为奇数,也就是剩余的空瓶,再加上用空瓶换来的汽水数就得到空瓶数,
//因此,empty/2 + empty % 2 就是空瓶数,作为参数继续调用Count函数,直到空瓶数不足,
//不能再换取汽水


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值