Clojure 为什么此代码不引发StackOverflow异常

Clojure 为什么此代码不引发StackOverflow异常,clojure,jvm,Clojure,Jvm,在clojure v1.6.0中,此代码将永远运行并消耗一个核心的100%: (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) 我希望它立即抛出一个StackOverflowError,但它没有 有什么解释吗

在clojure v1.6.0中,此代码将永远运行并消耗一个核心的100%:

(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)
我希望它立即抛出一个
StackOverflowError
,但它没有


有什么解释吗?

因为1是长的。代码开始计算非常长的有理数,并在几次迭代后慢到爬行。如果使用1.0和4运行它,那么在几千次调用后(可能会根据jvm参数的不同而有所不同),堆栈会很快崩溃。

要溢出它只需要执行几千次调用。这真的是一个很长的算术吗?它太慢了以至于不能快速计算10k的除法和和。这不是一个很长的算术。这是一个比率,它包含分母和分子中的大整数。大整数将任意增长。看见