我想我会构建一个愚蠢的非尾递归版本的乘法函数,看看它与正确的 TCO 相比如何。但是我注意到,在 REPL(我使用java -cp <classpath> clojure.main
配置为的Emacs inferior-lisp
)和从命令行调用程序时,显然正在发生某种优化/记忆。事实上,结果在 REPL 中更为明显。
(defn mult-silly [n m]
(if (> n 0)
(+ m (mult-silly (dec n) m))
0))
(dotimes [_ 5]
(println (time (mult-silly 5000 4))))
以上在 REPL 上产生:
user=> #'user/mult-silly
user=> "Elapsed time: 10.697919 ms"
20000
"Elapsed time: 3.069106 ms"
20000
"Elapsed time: 2.301474 ms"
20000
"Elapsed time: 1.285696 ms"
20000
"Elapsed time: 0.554158毫秒"
20000
知道为什么我会看到这个吗?