看了 defun-tco
之后发现写成 Tail call 的递归转化成循环可真是容易,试了下,速度没有提升,但是解决了递归过深时 max-lisp-eval-depth
的问题。
(defun sum (n init)
(if (= n 0)
init
(sum (- n 1) (+ n init))))
(defun-tco sum-tco (n init)
(if (= n 0)
init
(sum-tco (- n 1) (+ n init))))
(benchmark-run 10000 (sum 100 0))
=> (1.9151880000000001 8 1.363888999999972)
(benchmark-run 10000 (sum-tco 100 0))
=> (2.9346200000000002 12 2.045106999999973)
(benchmark-run 1000 (sum 1000 0))
error--> Lisp nesting exceeds `max-lisp-eval-depth'
(benchmark-run 1000 (sum-tco 1000 0))
=> (2.8758369999999998 12 2.0061310000000105)