Как я могу улучшить свою функцию, чтобы работать лучше? - PullRequest
0 голосов
/ 28 марта 2020

Я кодирую функцию, где мне нужно создать новый список, вставив определенное значение в список после позиции N. Вот код:

(DEFUN insertNth (L N insValue)
    (cond ((NULL L) NIL)
          ((NULL (CDR L)) (CONS (CAR L) (insValue)))
          (T (CONS (CAR L) (insertNth (CDR L) N insValue)))
    )    
)

Когда я пытаюсь проверить код, Я получаю эту ошибку: *** - EVAL: неопределенная функция INSVALUE. Возможно, мне не хватает какого-то шага или части функции?

1 Ответ

0 голосов
/ 29 марта 2020
(defun insertNth (l N insValue &optional (acc '()) (counter 0))
  (cond ((null l) (nreverse acc))
        ((= N counter) (nconc (nreverse acc) (list insValue) l))
        (t (insertNth (cdr l) N insValue (cons (car l) acc) (1+ counter)))))

Я взял деструктивные функции nreverse и nconc по соображениям производительности. Деструктивные функции здесь не представляют опасности, но улучшают производительность. Однако вы можете использовать неразрушающие функции reverse и append, которые будут вам более знакомы.

...