Clojure中的非尾递归匿名函数

时间:2011-04-11 19:44:39

标签: recursion lambda clojure

如何在Clojure中创建一个非递归的递归匿名函数?

以下显然不起作用,因为recur仅用于尾递归函数。我也不愿意拖入y-combinator ..

((fn [n] (if (= 1 n) 1 (* n (recur (dec n))))) 5)

2 个答案:

答案 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执行其操作的相同的自我应用程序。通过在需要时将整个函数的副本放在!范围内,您可以随时制作另一个副本。