我有一个函数用可选参数计算二项式展开,以指定开始和结束项:
(defun comb-index (s k)
(let ((combinations nil))
(labels ((rec (s k offset entry)
(cond ((equal s k)
(push (reverse (loop
for i from 1 to s
do (push (1- (+ i offset)) entry)
finally (return entry)))
combinations))
((equal k 0)
(push (reverse entry) combinations))
(t (rec (1- s) (1- k) (1+ offset) (cons offset entry))
(rec (1- s) k (1+ offset) entry)))))
(rec s k 0 nil))
(nreverse combinations)))
(defun binomial (k &key (start 1) end)
(let ((b start)
(e (if (null end) k end)))
(labels ((rec (i)
(cond ((equal i e)
(comb-index k e))
(t
(append (comb-index k i) (rec (1+ i)))))))
(rec b))
)
)
当我编译并运行此代码时,它将产生以下运行时错误:
Unhandled memory fault at #x18.
[Condition of type SB-SYS:MEMORY-FAULT-ERROR]
这是由e引起的,但我不确定原因。我可以通过将'e'分配给'k'或'end'来避免这个问题,或者只是使用(当......)将'end'设置为'k',如果它是nil,但是我不知道为什么这不起作用。
答案 0 :(得分:3)
答案 1 :(得分:1)
代码中的问题并不明显;它似乎只是一个真正的溢出。有什么方法可以调整底层Lisp系统可用的内存吗?命令行标志还是什么?
您是否可以选择使用Clojure等可以创建延迟序列的语言来实现此功能?您可能已经意识到,这种类型的计算有可能产生极大的结果。我似乎记得在一个Clojure / contrib库中做了一些只做这个计算的东西。