To jest kod seplicowy, który używa rekursji ogonowej.Rekursja ogona w clojure
(defun factorial (f n)
(if (= n 1)
f
(factorial (* f n) (- n 1))))
Przełożę to na kod clojure, oczekując optymalizacji rekursji tego samego ogona.
(defn fact [f n]
(if (= n 1)
f
(fact (* f n) (dec n))))
Jednakże mam to całkowitą przelewowy (nie przepełnienie stosu), nawet w małej ilości, takie jak (fact 1 30)
.
Próbowałem z recur
, ale dostałem ten sam błąd.
(defn factorial [f n]
(if (= n 1)
f
(recur (* f n) (dec n))))
Co jest nie tak z kodem clojure?
Ponadto warto zauważyć, że Clojure, z powodu ograniczeń JVM, nie umożliwia automatyczną optymalizację połączeń ogon. 'recur' jest w istocie sposobem na zastosowanie idiomu rekursywnego w tym przypadku. – JohnJ
Gdzie w dokumentach clojure mogę znaleźć przykłady użycia recur bez pętli? Sposób, w jaki użyłeś go tutaj. – SultanLegend