在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
,但它没有。
任何解释为何会发生?
答案 0 :(得分:8)
因为1很长。代码开始计算极长的有理数,并在几次迭代后慢慢爬行。如果你用1.0和4运行它,它会在几千次调用后非常快地吹掉堆栈(可能会因你的jvm参数而异)。