【问题标题】:How do these 'reverse' and 'twist' functions work in Ruby? (functional programming)这些 'reverse' 和 'twist' 函数在 Ruby 中是如何工作的? (函数式编程)
【发布时间】:2021-03-14 03:23:32
【问题描述】:

我在 Ruby 中使用 reduce 方法重新定义了函数 fold

def fold(f, init, lst)
    lst.reduce(init){|w, a| f.call(w, a)}
end

我在下面有 reversetwist 函数以及它们应该如何工作的示例。

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函数,我知道它的意思是“如果元素aArray中,它返回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


【解决方案1】:

如何才能反转只有[a] + w 的数组?? [] of Any 是什么意思?

[] of Any 不是合法的 Ruby 语法,它是 SyntaxError。由于代码甚至不是合法的语法,即它甚至无法解析,因此分析它的运行方式毫无意义,因为它根本无法运行

对于twist函数,我知道这意味着“如果元素aArray中,

不,它的意思是“如果元素aArray(或更准确地说,是一种Array

它返回twist(a)

不,它返回[twist(a)] + w

它不在Array

不,再次,这意味着“如果a 不是 Array

它只返回a"。

不,它返回[a] + w

但我不明白这个算法是如何工作的..

a 是当前元素,w 是我们目前构建的结果。如果a 是一个简单元素(不是Array),我们返回[a] + w,换句话说,我们将a 移到开头。

如果aArray,我们首先调用twist然后将它移到开头。

【讨论】:

  • 感谢您指出我的错误!我不知道它移动到“开始”......它帮助了很多☺️☺️
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-09
相关资源
最近更新 更多