【问题标题】:Applying the Y-Combinator to a recursive function with two arguments in Clojure?在 Clojure 中将 Y-Combinator 应用于具有两个参数的递归函数?
【发布时间】:2011-03-29 19:48:21
【问题描述】:

在 Clojure 中为单个参数函数(例如阶乘或斐波那契)执行 Y-Combinator 有很好的记录: http://rosettacode.org/wiki/Y_combinator#Clojure

我的问题是 - 例如,对于像这个 getter 这样的两个参数函数,你如何做到这一点?

(这里假设我想递归解决这个问题,而这个非惯用的 clojure 代码是出于另一个原因而故意存在的)

[非 y-combinator 版本]

(defn get_ [n lat]
    (cond
      (empty? lat) ()
        (= 0 (- n 1)) (first lat)
        true (get_ (- n 1) (rest lat))))

(get_ 3 '(a b c d e f g h i j))

【问题讨论】:

  • (= 0 (- n 1)) 确实是一种精巧的表达方式(= n 1)。顺便问一下,为什么第四行和第五行的缩进比第三行多?
  • 有什么特别的理由让这个getter基于1吗?

标签: recursion clojure lisp y-combinator


【解决方案1】:

args 的数量不会改变任何东西,因为 argsapply'd。你只需要改变get_的结构:

(定义 get_ [f] (fn [n 纬度] (条件 (空?纬度)() (= 1 n) (第一纬度) :else (f (dec n) (next lat))))) (定义 Y [f] ((fn [x] (x x)) (fn [x] (f (fn [& 参数] (应用 (x x) args)))))) 用户=> ((Y getf) 3 '(a b c d e f g h i j)) C

【讨论】:

    【解决方案2】:

    这会很简单。

    假设你有一个函数 H:

    (def H
      (fn [x] 
            (fn [x y]
                  (stuff happens))))
    

    然后你应用相同的 ol' Y-Combinator:

    ((Y H) 4 5)
    

    其中45 是您要传递给H 的参数。

    组合器本质上是“处理” H 中的顶级函数,而不是做繁重工作的那个(这里是 arity 2 的那个)。

    【讨论】:

      猜你喜欢
      • 2021-07-17
      • 2014-09-24
      • 1970-01-01
      • 2012-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多