汽水瓶

汽水瓶

题目

有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?题目出处

思路

函数递归调用

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include<stdio.h>
#pragma warning(disable : 4996)
static int la; //依次能喝到的数目
static int sum; //能喝到的总瓶数
int enough(int i); //计算函数
int main(void)
{
int i=0, j;
int a[10];
while (scanf("%d", &j)!=EOF)
{
if (j == 0) continue;
else a[i++] = enough(j);
la = 0;
sum = 0;
}

for (j = 0; j < i; j++)
printf("%d\n", a[j]);
return 0;
}
int enough(int i)
{


int b = 0, c = 0;
b = i / 3;
c = i % 3;
if (b > 0)
la += b;
if ((b + c) >= 3)
enough(b + c); //递归调用
if ((b + c) == 2&&sum==0)
la++;
sum = la;
return sum;
}

反思

是否可以写成尾递归,加入一个记录上次数据的参数?

打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2020 lsengard
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信