Dies ist ein Lisp-Code, der Tail-Rekursion verwendet.Tail Rekursion in Clojure
Ich übersetze dies in Clojure-Code erwartet die gleiche Tail-Rekursion-Optimierung.
(defn fact [f n]
(if (= n 1)
f
(fact (* f n) (dec n))))
Allerdings habe ich diesen Integer-Überlauf (nicht über Stack) auch bei kleiner Zahl wie (fact 1 30)
.
ArithmeticException integer overflow clojure.lang.Numbers.throwIntOverflow (Numbers.java:1374)
Ich habe versucht, mit recur
, bekam aber den gleichen Fehler.
(defn factorial [f n]
(if (= n 1)
f
(recur (* f n) (dec n))))
Was ist falsch mit dem Clojure-Code?
Auch lohnt es sich, darauf hingewiesen, dass Clojure, aufgrund von Einschränkungen der JVM, nicht automatisch Endrekursion Optimierung unterstützt. 'recur 'ist in der Tat der Weg für eine rekursive Redewendung in diesem Fall. – JohnJ
Wo finde ich in der clojure docs Beispiele für die Verwendung von reacon ohne Schleife? So wie du es hier benutzt hast. – SultanLegend