Переставить 2 элемента списка местами заданные по индексу (ошибка) - Lisp

Узнай цену своей работы

Формулировка задачи:

Переставить 2 элемента списка местами заданные по индексу (номеру)
func
(defun swap
(List i1 i2)(let ((first nil)(second nil)(res nil)(tmp List)(i 0))
(loop (cond ((= i i1)
(setq first (car List)))((= i i2)
(setq second (car List))))(if (and first second)(return))
(setq List (cdr List))(setq i (+ i 1)))
(setq i 0)(loop (if (null tmp)(return))(cond ((= i i1)
(setq res (cons second res)))((= i i2)
(setq res (cons first res)))(T (setq res (cons (car tmp) res))))
(setq tmp (cdr tmp))
(setq i (+ i 1)))(reverse res)))
==> swap Файл C:\HomeLisp\7.lsp успешно загружен (swap '(1 2 3 4 5) 1 2) Неожиданный конец списка. Последнее выражение: NIL Глубина вызова EVAL: 3 ==> ERRSTATE Связанно наверно с какой то особенностью хоумлиспа, помогите понять что не так

Решение задачи: «Переставить 2 элемента списка местами заданные по индексу (ошибка)»

textual
Листинг программы
(defun swap (n m w)
  (rotatef (nth n w)
           (nth m w))
  w)
 
> (swap 2 5 '(1 2 3 4 5 6 7))
(1 2 6 4 5 3 7)

Объяснение кода листинга программы

В коде определён пользовательский функционал swap, который принимает три аргумента: n (номер первого элемента), m (номер второго элемента) и w (сам список). Функция rotatef используется для перестановки элементов в списке w на позиции, заданные номерами n и m. Поскольку функция rotatef меняет список w на месте, то после её вызова список w будет изменён. Таким образом, результат выполнения функции swap будет равен изменённому списку w. В данном примере список w имеет вид (1 2 3 4 5 6 7), а после выполнения функции swap с заданными аргументами (2 5) результат будет следующим: (1 2 6 4 5 3 7).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.929 из 5
Похожие ответы