In clojure v1.6.0 wirft, dieser Code ausgeführt wird nur immer und verbraucht 100% eines Kern:Warum dieser Code nicht Stackoverflow Ausnahme
(defn average [x y] (/ (+ x y) 2))
(defn improve [guess x]
(average guess (/ x guess)))
(defn sqrt-iter [guess x]
(sqrt-iter (improve guess x) x))
(sqrt-iter 1 4)
Ich würde erwarten, dass es eine StackOverflowError
sofort zu werfen, aber es nicht.
Jede Erklärung, warum es passiert?
Um zu überlaufen, müssen nur einige tausend Anrufe ausgeführt werden. Ist es wirklich lang arithmetisch * so langsam *, dass es 10k Divisionen und Summen nicht schnell berechnen kann? – zerkms
Es ist nicht lange Arithmetik. Es ist ein Verhältnis, das BigIntegers im Nenner und Zähler enthält. BigIntegers wird beliebig lange wachsen. Siehe https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Ratio.java –