汽水瓶问题: 有这样一道智力题:”某商店规定:三个空汽水瓶可一换一瓶汽水,小张手上有十个空汽水瓶,她最多可以喝多少瓶汽水? 答案是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)