我正在尝试解决一个简单的Ruby Quiz问题,并且在使用哈希时遇到了麻烦。当我使钱包成为常规变量时,循环不知道变量wallet
,当我使它成为@wallet
时,在循环后返回时,合并不会持久存在。
我还尝试了merge!
收集所有垃圾并保存以前测试的数据。
class Coins
COINSTAR = { :H=>50,:Q=>25,:D=>10,:N=>5,:P=>1 }
def self.make_change(value)
return {} if value == 0
COINSTAR.each do |k,v|
wallet = Hash.new
if value >= v
wallet.merge(k=>value / v)
value = value - (v * (value % v))
end
end
wallet
end
end
#Test run
Coins.make_change(26)
Coins.make_change(91)
Coins.make_change(1)
#=>returns
# {:P=>1, :Q=>1}
# {:P=>1, :Q=>1, :H=>1}
# {:P=>1, :Q=>1, :H=>1}
关于如何在不收集先前测试数据的情况下持久化哈希的任何想法?
答案 0 :(得分:3)
要使其发挥作用,您需要解决3个问题。
首先,正如ymonad所说,在每个循环之前移动wallet = Hash.new
。
其次,将merge
更改为merge!
。
第三,将value = value - (v * (value % v))
更改为value = value % v
。
需要进行第一次更改才能将钱包移到方法def self.make_change的范围内,而不是每个循环的范围。
需要进行第二次更改,因为您希望将数据保留在每个循环的所有迭代中(因此您可以获得半美元,四分之一,硬币,镍币和便士)。
需要进行第三次更改以确保价值等于剩余的硬币数量(例如,值为91,v为50,91 % 50
= 41
,但91 - (50 * (91 % 50))
= {{1 }} = 91 - (50 * 41)
= (91 - 2050)
)。