发布: 江湖程序员 来源: 本站原创 时间: 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
---= 已经到底 =---