红宝石非贪婪memoized哈希,硬币找零的解决方案:硬币更改递归散列(解释)?
def coin_change amt, denom_arr
coins = Hash.new do |coin, key|
coin[key] = if key < denom_arr.min
[]
elsif denom_arr.include? key
[key]
else
denom_arr.
reject { |coin| coin > key }.
reduce([]) { |memo, denom| memo.any? {|coin| coin%denom==0 } ? memo : memo+[denom] }.
map {|denom| [denom] + coin[key-denom]}.
min { |a, b| a.size <=> b.size }
end
end
coins[amt]
end
p coin_change 6, [4,3,1]
#=> [3,3]
究竟被送入这条线? .reduce([]) { |memo, denom| memo.any? {|coin| coin%denom==0 } ? memo : memo+[denom] }
(据我可以告诉它是一个硬币<键阵列)有人可以告诉我一个如何这个细分的例子?
另外我得到,如果{|coin| coin%denom==0 }
是真的返回memo
但什么是memo+[denom]
究竟是什么?
我明白.any?
方法返回真如果块返回非假或零的值。
我以为memo
是一个数组,但我打电话给它的类,它返回Class
?
[4,3,8,7].inject([]) { |memo, denom| memo.class }
#=> Class
总之有人可以在步骤与示例输出解释:
- 这条线:
.reduce([]) { |memo, denom| memo.any? {|coin| coin%denom==0 } ? memo : memo+[denom] }
- 你能给的递归码哈希键/值对每个内容示例迭代? **
** ie。 denom_arr = 4,3,1
和amt = 6
第一次传递哈希的样子是什么样的?二次传递哈希是什么样子?在第三遍等等,直到完成...什么是散列样子?
hmm .. http://codereview.stackexchange.com/也许? – quetzalcoatl
@quetzalcoatl我认为它的套件更好,因为codereview给我建议我理解代码,并期待可能优化它,而SO更多是*帮助我理解这种类型的论坛。 – fyz