换水瓶

问题描述:
假设1元钱买一瓶水,三个空瓶可以换一瓶水。初始n元最终可以喝到几瓶水?

初步思路:
1、利用递推的思想,将现有空瓶可兑换的瓶数加上余下的空瓶数作为新的空瓶数进行下一步计算,直到新的空瓶数小于3时停止。
2、每三个空瓶可以得到一瓶水和一个空瓶,也就是说每两个空瓶可以使喝到的水+1,因此可以得出递推公式: bottle(n) = 1 + bottle(n - 2) ,n > 2
3、由递推公式易知每两个空瓶可得1瓶水,因此整理后可得到通用计算公式:
\left\{\begin{array}{} n + n//(m-1)-1, & n \space mod \space 2=0\\ n + n//(m-1), & n \space mod \space 2=1\ \end{array}\right.其中//表示整除,mod表示取余

代码如下:

def buy_water(n):
    # 递推实现
    num = n
    empty = num
    while True:
        if empty < 3:
            break
        num += empty // 3
        empty = empty // 3 + empty % 3
    return num


def buy_water_(n):
    # 空瓶换水递推
    def exchange(x):
        if x < 3:
            return 0
        else:
            return 1 + exchange(x - 2)

    return n + exchange(n)


def buy_water_formula(n):
    # 公式实现
    if n % 2 == 0 and n != 0:
        return n + n // (3 - 1) - 1
    else:
        return n + n // (3 - 1)


if __name__ == '__main__':
    print(buy_water(30))
    print(buy_water_(30))
    print(buy_water_formula(30))
    # all out 44
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 上一次给你们安利了贵州,今天想推荐一个距离贵州很近、适合短途旅行的网红城市,雾都重庆。 如果你还没去过重庆,你对重...
    流浪摄影师阅读 12,025评论 46 189
  • 那天,我闭目盘坐于高岗之上,岗峰破云,头顶蓝天甚是清明。 周身群峰耸立,云雾中峰顶若隐若现,一轮红...
    书香自华阅读 3,480评论 2 0
  • 今天继续制作复习课件,绝对原创,但还有修改的空间,继续琢磨吧。只是觉得这学期要是每节课都如此上法的话,好累。 心中...
    我在枣快乐呀阅读 1,625评论 1 4

友情链接更多精彩内容