【发布时间】:2011-05-27 17:31:17
【问题描述】:
我正在学习 Lisp,并编写了以下函数来收集结果列表。
(defun collect (func args num)
(if (= 0 num)
()
(cons (apply func args)
(collect func args (- num 1)))))
它产生与内置循环函数类似的输出。
CL-USER> (collect #'random '(5) 10)
(4 0 3 0 1 4 2 1 0 0)
CL-USER> (loop repeat 10 collect (random 5))
(3 3 4 0 3 2 4 0 0 0)
但是,当我尝试生成一个 100,000 个元素长的列表时,我的 collect 函数会破坏堆栈
CL-USER> (length (collect #'random '(5) 100000))
Control stack guard page temporarily disabled: proceed with caution
而循环版本没有
CL-USER> (length (loop repeat 100000 collect (random 5)))
100000
如何使我的版本更节省空间,是否有替代 consing 的方法?我认为它是尾递归的。我正在使用 sbcl。任何帮助都会很棒。
【问题讨论】:
标签: optimization recursion lisp common-lisp