Обыкновенный шепот - PullRequest
       61

Обыкновенный шепот

1 голос
/ 04 августа 2011

У меня есть функция вычисления биномиального расширения с необязательными параметрами для указания начального и конечного членов:

(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' либо с 'k', либо с 'end', либо просто используя (когда ...) установить 'end' на 'k', если это ноль, но я не уверен, почему это не работает

Ответы [ 2 ]

3 голосов
/ 04 августа 2011

Похоже на переполнение памяти ...

Вы когда-нибудь задумывались об эффективности памяти вашего кода?

1 голос
/ 04 августа 2011

Проблема в коде не очевидна;это просто кажется реальным переполнением.Можно ли как-то настроить объем памяти, доступной для базовой системы Lisp?Флаги командной строки или что-то в этом роде?

У вас есть возможность реализовать это на языке, подобном Clojure, который может создавать ленивые последовательности?Как вы, вероятно, знаете, этот тип расчета может привести к чрезвычайно большим результатам.Кажется, я вспомнил кое-что в одной из библиотек Clojure / contrib, которая выполняла только этот расчет.

...