为什么这段代码不会抛出StackOverflow异常

时间:2014-11-16 06:10:11

标签: 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,但它没有。

任何解释为何会发生?

1 个答案:

答案 0 :(得分:8)

因为1很长。代码开始计算极长的有理数,并在几次迭代后慢慢爬行。如果你用1.0和4运行它,它会在几千次调用后非常快地吹掉堆栈(可能会因你的jvm参数而异)。