Не хвостовые рекурсивные анонимные функции в Clojure - PullRequest
23 голосов
/ 11 апреля 2011

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

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

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

Ответы [ 2 ]

44 голосов
/ 12 апреля 2011

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

user> ((fn ! [n] (if (= 1 n) 1 (* n (! (dec n))))) 5)
120
4 голосов
/ 12 апреля 2011

Вот способ сохранить анонимность, в основном:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...