如何在Clojure中创建一个非递归的递归匿名函数?
以下显然不起作用,因为recur
仅用于尾递归函数。我也不愿意拖入y-combinator ..
((fn [n] (if (= 1 n) 1 (* n (recur (dec n))))) 5)
答案 0 :(得分:44)
通过在fn
和arglist之间指定函数,可以为函数指定名称以引用自己:
user> ((fn ! [n] (if (= 1 n) 1 (* n (! (dec n))))) 5)
120
答案 1 :(得分:4)
这是一种让它保持匿名的方式,主要是:
(((fn [!] (fn [n] (if (= 1 n) 1 (* n ((! !) (dec n))))))
(fn [!] (fn [n] (if (= 1 n) 1 (* n ((! !) (dec n)))))))
5)
它不是Y组合器,但它确实包含允许Y执行其操作的相同的自我应用程序。通过在需要时将整个函数的副本放在!
范围内,您可以随时制作另一个副本。