面试题之空瓶子换水问题及其扩展规律(python实现)
问题描述:
有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空 汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满 的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?
初步思路:一个空瓶子喝不了水,两个空瓶子可以喝到一瓶水,因此可以采用递归算法实现
代码实现如下:
def f(n):
if n < 2:return 0
elif n == 2:return 1
return f(n-2)+1
def solve():
for n in sys.stdin:
n = int(n.strip())
print(f(n))
if __name__ == "__main__":
solve()
写完代码之后,经过数学分析又发现,结果其实就是n/2
再回头看一开始的思路,一个空瓶子喝不了水,两个空瓶子可以喝到一瓶水
其实已经说明了答案,两个空瓶子可以喝一瓶水,n/2的结果就是这样来的
因此当问题扩展为m个瓶子可以换一瓶水的话
思路不变,m-1个瓶子就可以喝到一瓶水,所以最终的答案为n/(m-1)
有了以上结论之后,代码就可以进一步完善,不用递归,由公式n/(m-1)即可直接得出答案
如有错误,欢迎指正和交流~