2011-08-04 91 views
1

我有一个函数计算与可选参数二项式扩展到指定起止期限:当我编译的Common Lisp让结合

(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'来避免这个问题,或者简单地使用(when ...)将'end'设置为'k',如果它是零,但我不知道为什么这不起作用。

+0

什么是comb-index? –

+0

@Vijay这是我用来计算(S k)组合的另一个函数,我将它添加到问题中。 – sudo

+0

你如何运行代码?你用什么参数调用函数? –

回答

3

看起来像一个内存溢出......

有没有想过你的代码的存储效率?

1

代码中的问题并不明显;它似乎是一个真正的溢出。有什么方法可以调整底层Lisp系统可用的内存吗?命令行标志什么的?

你有选择使用像Clojure这样的语言来实现这个功能,它可以创建惰性序列吗?正如你可能知道的那样,这种计算有可能产生非常大的结果。我似乎回想起只用这个计算的Clojure/contrib库中的一些东西。

+0

我可以避免任何问题。但我只是想了解是什么导致了内存故障。 – sudo

+1

Common Lisp有一个懒惰库:http://common-lisp.net/project/clazy/所以没有必要用另一种语言来实现它。 –