Questo è un codice Lisp che utilizza la ricorsione della coda.Ricorsione della coda in clojure
(defun factorial (f n)
(if (= n 1)
f
(factorial (* f n) (- n 1))))
Traduco questo codice in clojure in attesa della stessa ottimizzazione della ricorsione in coda.
(defn fact [f n]
(if (= n 1)
f
(fact (* f n) (dec n))))
Comunque ho ottenuto questo integer overflow (non impilare overflow), anche con il piccolo numero, ad esempio (fact 1 30)
.
ArithmeticException integer overflow clojure.lang.Numbers.throwIntOverflow (Numbers.java:1374)
ho provato con recur
, ma ho ottenuto lo stesso errore.
(defn factorial [f n]
(if (= n 1)
f
(recur (* f n) (dec n))))
Cosa c'è di sbagliato con il codice clojure?
Inoltre vale la pena notare che Clojure, a causa delle limitazioni della JVM, non supporta l'ottimizzazione automatica delle chiamate coda. 'recur' è davvero la strada da percorrere per un linguaggio ricorsivo in questo caso. – JohnJ
In quali documenti del clojure posso trovare esempi di utilizzo ricorrenti senza loop? Il modo in cui lo hai usato qui. – SultanLegend