汽水瓶问题: 有这样一道智力题:”某商店规定:三个空汽水瓶可一换一瓶汽水,小张手上有十个空汽水瓶,她最多可以喝多少瓶汽水? 答案是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)
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did162286