在微课课堂上,我们讲解了汉诺塔移动的实现,并且通过课堂,我们重新回顾了递归算法。为了巩固大家的学习成果,我们一起来做下面的习题吧!
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);
}
}
好哒,课后小习题就解析到这里了,有疑问的欢迎在评论区留言哟!