汽水瓶问题:
有这样一道智力题:”某商店规定:三个空汽水瓶可一换一瓶汽水,小张手上有十个空汽水瓶,她最多可以喝多少瓶汽水? 答案是5瓶, 提示:最后剩余2空瓶子的时候,可以问老板借一瓶汽水,然后用3个空瓶子抵一瓶汽水还给老板
如果小张手上有n(n>1)个空汽水瓶,最多可以换多少瓶汽水?
问题分析:
空瓶换汽水,汽水喝完又会产生空瓶,问题抽象出来,就是空瓶的不断消耗过程,我们换到最后空瓶数量不够无法继续换的时候,无非就两种情况:
1 : 剩余1瓶的情况,这时已经无法交换,得到的汽水数量已确定
2 : 剩余2瓶的情况, 此时可以问老板借一瓶,因此得到的汽水数量要在原先基础上加1
看如下代码:
循环版:
def exchange_bottle(n):
get_drink = 0
while n >= 3:
# 换来饮料的数量,也是空瓶增加的数量
bottle_add = n // 3
# 用来换饮料消耗的空瓶数量
bottle_reduce = bottle_add * 3
# 一次交易后,当前空瓶的数量
n = n + bottle_add - bottle_reduce
# 一次交易后,得到饮料的数量
get_drink += bottle_add
if n == 2:
get_drink += 1
return get_drink
result = exchange_bottle(10)
print(result)
递归版:
def exchange_bottle(n,get_drink):
if n == 2:
get_drink += 1
return get_drink
if n == 1:
return get_drink
if n >= 3:
# 换来饮料的数量,也是空瓶增加的数量
bottle_add = n // 3
# 用来换饮料消耗的空瓶数量
bottle_reduce = bottle_add * 3
# 一次交易后,当前空瓶的数量
n = n + bottle_add - bottle_reduce
# 一次交易后,得到饮料的数量
get_drink += bottle_add
return exchange_bottle(n,get_drink)
result = exchange_bottle(10,0)
print(result)
类封装版:
class GetDrink:
def __init__(self,n):
self.n = n
self.get_drink = 0
self.exchange_bottle()
def exchange_bottle(self):
if self.n == 2:
self.get_drink += 1
return self.get_drink
if self.n == 1:
return self.get_drink
if self.n >= 3:
bottle_add = self.n // 3
bottle_reduce = bottle_add * 3
self.n = self.n + bottle_add - bottle_reduce
self.get_drink += bottle_add
return self.exchange_bottle()
if __name__ == '__main__':
result = GetDrink(10)
print(result.get_drink)