Ответ 1
Функции могут быть даны имя, чтобы ссылаться на себя, указав его между fn
и arglist:
user> ((fn ! [n] (if (= 1 n) 1 (* n (! (dec n))))) 5)
120
Как создать рекурсивную анонимную функцию в Clojure, которая не является хвостовой рекурсивной?
Следующие явно не работают, поскольку recur
- только для хвостовых рекурсивных функций. Я также не хочу перетаскивать y-combinator..
((fn [n] (if (= 1 n) 1 (* n (recur (dec n))))) 5)
Функции могут быть даны имя, чтобы ссылаться на себя, указав его между fn
и arglist:
user> ((fn ! [n] (if (= 1 n) 1 (* n (! (dec n))))) 5)
120
Вот способ, который делает его анонимным, в основном:
(((fn [!] (fn [n] (if (= 1 n) 1 (* n ((! !) (dec n))))))
(fn [!] (fn [n] (if (= 1 n) 1 (* n ((! !) (dec n)))))))
5)
Это не совсем Y combinator, но он содержит тот же бит самоприложения, который позволяет Y делать свою работу. Имея копию всей функции в области !
, когда она вам нужна, вы всегда можете сделать другую копию.