递归课后小练习—瓶盖问题

在微课课堂上,我们讲解了汉诺塔移动的实现,并且通过课堂,我们重新回顾了递归算法。为了巩固大家的学习成果,我们一起来做下面的习题吧!

1元钱一瓶汽水,喝完之后两个空瓶换一瓶汽水。 问:若你有20元钱,你最多能喝多少瓶汽水?

那么我们接下来我们来分析一下过程吧!
首先我有N元钱,买了N瓶汽水,喝完汽水剩下N个空瓶;
然后用N个空瓶,换了N/2瓶汽水,喝完汽水剩下N/2个空瓶;
然后用N/2个空瓶,换了(N/2)/2瓶汽水,喝完汽水剩下(N/2)/2个空瓶;

最后用2个空瓶,换了一瓶汽水,喝完汽水剩下一个空瓶,过程结束。

通过分析,我们得知,这是一个循环往复的问题,运用递归算法来解决。

在微课课堂上,我们解决递归问题分为了三步:

1、明确递归终止条件; 2、给出递归终止时的处理办法; 3、提取重复的逻辑,缩小问题规模。

通过分析我们知道终止条件便是 只剩一个空瓶  之后就不需要再次换瓶子了 

之后我们要考虑我们有奇数个瓶子或者偶数个瓶子

如果有奇数个瓶子,剩的一个瓶子与最后一个空瓶换饮料

那么如果有偶数个瓶子,那就正正好好啦

代码如下

/*n 为汽水数量*/
int drink(int n)
{
    if (n == 1) {
        // 递归终止条件
        return 1;

        }else if(n % 2 == 1) {
            //奇数瓶情况
            return n + 1 + drink(n/2);

        }else {
            // 偶数瓶情况
            return n + drink(n/2);
    }
}

好哒,课后小习题就解析到这里了,有疑问的欢迎在评论区留言哟! 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值