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

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

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

То, что есть на форуме, у меня не работает. Мне нужно использовать функции car и cdr. Совсем не понимаю, как сделать

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

textual
Листинг программы
  1. ;; вспомогательная функция, вырезающая из списка lst отрезок длины l с позиции n
  2.  
  3. (defun cut-list (lst n l)
  4.   (cond ((zerop l) nil)
  5.         ((and (= n 1) (> l 0)) (cons (car lst) (cut-list (cdr lst) 1 (- l 1))))
  6.         (t (cut-list (cdr lst) (- n 1) l))))
  7.  
  8. ;; Решение
  9.  
  10. (defun task (lst p q)
  11.   (cond ((= p q) lst)
  12.         ((> p q) (task lst q p))
  13.         (t  (let* ((ls (length lst))
  14.                   (l (cut-list lst 1 (- p 1)))
  15.                   (m (cut-list lst p (- q p)))
  16.                   (r (cut-list lst q (- ls q -1))))
  17.             (append l (list (car r)) (cdr m) (list (car m)) (cdr r))))))
  18.  
  19. ==> TASK
  20.  
  21. (task '(1 2 3 4 5 6 7) 5 3)
  22.  
  23. ==> (1 2 5 4 3 6 7)
  24.  
  25. (task '(1 2 3 4 5 6 7) 3 5)
  26.  
  27. ==> (1 2 5 4 3 6 7)

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

Код решает задачу перестановки двух элементов в списке, заданных по индексу. Список разбивается на три части: левая, средняя и правая. Индексы начала и конца переставляемых элементов определяются в соответствии с заданными индексами. Если индексы некорректны (равны или один больше другого), то они меняются местами и рекурсивно вызывается функция для решения задачи на подсписках. Если индексы корректны, то рекурсивно вызывается функция для получения двух подсписков: левого и правого. Затем, вставляются два элемента в середину списка, в соответствии с индексами, и рекурсивно вызывается функция для оставшихся подсписков. В итоге, функция возвращает измененный список.

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


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

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

7   голосов , оценка 3.571 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы