python
网站首页 |   



  • [课程章节]第14节:递归函数解:喝啤酒、空瓶与盖子兑换的问题.
  • 发布: 江湖程序员 来源: 本站原创 时间: 2014/11/25 12:00:00
    (70) 点赞: (24) 标签: 课程习题


    问题描述:
    点击图片查看原图:
    #推衍步骤:
    20元买20瓶            计20瓶 --> 20空瓶,20瓶盖
    20空瓶=10瓶 20瓶盖=5瓶 计15瓶 --> 15空瓶,15瓶盖 = 35
    15空瓶=7瓶  15瓶盖=3瓶 计10瓶 --> 10空瓶,10瓶盖 + 余1空瓶,3瓶盖 = 45
    11空瓶=5瓶  13瓶盖=3瓶 计8瓶  --> 8空瓶,8瓶盖  + 余1空瓶,1瓶盖 = 53
    9空瓶=4瓶  9瓶盖=2瓶  计6瓶   --> 6空瓶,6瓶盖    + 余1空瓶,1瓶盖 = 59
    7空瓶=3瓶   7瓶盖=1瓶  计4瓶  --> 4空瓶,4瓶盖  + 余1空瓶,3瓶盖 = 63
    5空瓶=2瓶   7瓶盖=1瓶  计3瓶  --> 3空瓶,3瓶盖  + 余1空瓶,3瓶盖 = 66
    4空瓶=2瓶   6瓶盖=1瓶  计3瓶  --> 3空瓶,3瓶盖  + 余0空瓶,2瓶盖 = 69
    3空瓶=1瓶   5瓶盖=1瓶  计2瓶  --> 2空瓶,2瓶盖  + 余1空瓶,1瓶盖 = 71
    3空瓶=1瓶   3瓶盖=0瓶  计1瓶  --> 1空瓶,1瓶盖  + 余1空瓶,3瓶盖 = 72
    2空瓶=1瓶   4瓶盖=1瓶  计2瓶  --> 2空瓶,2瓶盖  + 余0空瓶,0瓶盖 = 74
    2空瓶=1瓶   2瓶盖=0瓶  计1瓶  --> 1空瓶,1瓶盖  + 余0空瓶,2瓶盖 = 75
    最后得75瓶余下1空瓶和3个瓶盖
    编程解题(一行代码一个程序风格):
    print((lambda a,b,c,f=lambda s,x,y,f:not (x < 2 and y < 4) and f(
        s + x // 2 + y // 4, x % 2 + x // 2 + y // 4, y % 4 + x // 2 + y // 4, f) or (s,x,y):f(a,b,c,f))(20, 20, 20))
    编程解题(普通写法):
    def f(s,x,y):#依次是:(瓶,空瓶,盖子)
        print(s)
        x,x1 = divmod(x,2)#空瓶数与可兑换的数量(2)作求余运算,并返回商
        y,y1 = divmod(y,4)#瓶盖数与可兑换的数量(4)作求余运算,并返回商
        if x == 0 and y == 0 and x1 < 2 and y1 < 4:#判断递归终止的条件,即不足以继续兑换
            return s,x1,y1#输出答案(瓶,空瓶,盖子)
        else:
            return f(s+x+y,x1+x+y,y1+x+y)#将返回结果作为参数再回调函数
                         #依次返回的结果s+x+y  本身可以买到的瓶数(s)+空瓶兑换的瓶数(x)+瓶盖兑换的瓶数(y)
                         #             x1+x+y 记录当次兑换后所拥有的空瓶数量
                         #             y1+x+y 记录当次兑换后所拥有的瓶盖数量
        
    s = 20
    print(f(s,s,s,))
    输出结果:
    20
    35
    45
    53
    59
    63
    66
    69
    71
    72
    74
    75
    (75, 1, 3)

    作者:江湖程序员 (python帮助网)
    转载请注明出处: www.pythonhelp.cn


    ---= 已经到底 =---