我试图解决的问题如下:
给定 n 美元,你有无限的便士、五分钱、一角硬币和 25 美分硬币,计算表示 n 的方法的总数。
我想出了一个递归解决方案(假设 n 是 0.25 美元,所以输出不是一些荒谬的数字):
def changes(w, x, y, z)
if 0.01 * w + 0.05 * x + 0.1 * y + 0.25 * z > 0.25
return
elsif 0.01 * w + 0.05 * x + 0.1 * y + 0.25 * z == 0.25
@@counter += 1
puts "w: #{w} x: #{x} y: #{y} z: #{z}"
else
changes(w + 1, x, y, z)
changes(w, x + 1, y, z)
changes(w, x, y + 1, z)
changes(w, x, y, z + 1)
end
end
@@counter = 0
changes(0, 0, 0, 0)
puts @@counter
基本上这里的想法是在匹配时增加计数器,否则尝试下一个可能的面额。
但是在输出中有很多重复,例如:
w: 15 x: 0 y: 1 z: 0
w: 15 x: 0 y: 1 z: 0
w: 15 x: 0 y: 1 z: 0
w: 15 x: 0 y: 1 z: 0
w: 15 x: 0 y: 1 z: 0
w: 10 x: 1 y: 1 z: 0
w: 15 x: 0 y: 1 z: 0
w: 10 x: 1 y: 1 z: 0
有人可以告诉我为什么吗?在我的递归中,我不是总是传入具有不同值的参数吗?为什么会多次打印相同的值?
谢谢你。