Подтвердить что ты не робот

Не хвостовые рекурсивные анонимные функции в Clojure

Как создать рекурсивную анонимную функцию в Clojure, которая не является хвостовой рекурсивной?

Следующие явно не работают, поскольку recur - только для хвостовых рекурсивных функций. Я также не хочу перетаскивать y-combinator..

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

Ответ 1

Функции могут быть даны имя, чтобы ссылаться на себя, указав его между fn и arglist:

user> ((fn ! [n] (if (= 1 n) 1 (* n (! (dec n))))) 5)
120

Ответ 2

Вот способ, который делает его анонимным, в основном:

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

Это не совсем Y combinator, но он содержит тот же бит самоприложения, который позволяет Y делать свою работу. Имея копию всей функции в области !, когда она вам нужна, вы всегда можете сделать другую копию.