【发布时间】:2021-03-14 03:23:32
【问题描述】:
我在 Ruby 中使用 reduce 方法重新定义了函数 fold。
def fold(f, init, lst)
lst.reduce(init){|w, a| f.call(w, a)}
end
我在下面有 reverse 和 twist 函数以及它们应该如何工作的示例。
reverse ‘(a b (c d) e)) --> (e (c d) b a)
def reverse(lst)
fold(lambda{|w, a| [a] + w}, [] of Any, lst)
end
如何反转只有[a] + w 的数组??
[] of Any 是什么意思?
twist ‘(a b (c d) e)) --> (e (d c) b a)
def twist(lst)
fold(lambda{|w, a| ([a.kind_of?(Array) ? twist(a) : a]) + w}, [], lst)
end
对于twist函数,我知道它的意思是“如果元素a在Array中,它返回twist(a),它不在Array中,它只返回a ”。但我不明白这个算法是如何工作的..
【问题讨论】:
-
[1,2,3,4,5].reduce([]) { |w, a| [a] + w }可能更容易分析。它还反转了数组,但没有所有的间接性。 -
@Stefan 但是“添加”([a]+w)如何使它反转呢?我不明白算法
-
@Stefan 哦,它只是不断将每个元素添加到数组的“开始”吗?
-
它是
[1] + []→[2] + [1]→[3] + [2, 1]→[4] + [3, 2, 1]等等。左边是包裹在[...]中的当前元素,右边是块的前一个结果。你也可以写reduce([]) { |w, a| w.unshift(a) },它会重复使用初始的[],而不是在每次迭代时创建新的数组。 -
@Stefan 哇,我马上就明白了... thxx 这么多!!!
标签: ruby functional-programming reverse reduce