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

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

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

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

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

textual
Листинг программы
;; вспомогательная функция, вырезающая из списка lst отрезок длины l с позиции n
 
(defun cut-list (lst n l) 
  (cond ((zerop l) nil)
        ((and (= n 1) (> l 0)) (cons (car lst) (cut-list (cdr lst) 1 (- l 1))))
        (t (cut-list (cdr lst) (- n 1) l))))
 
;; Решение
 
(defun task (lst p q)
  (cond ((= p q) lst)
        ((> p q) (task lst q p))
        (t  (let* ((ls (length lst))
                  (l (cut-list lst 1 (- p 1)))
                  (m (cut-list lst p (- q p)))
                  (r (cut-list lst q (- ls q -1))))
            (append l (list (car r)) (cdr m) (list (car m)) (cdr r))))))
 
==> TASK
 
(task '(1 2 3 4 5 6 7) 5 3)
 
==> (1 2 5 4 3 6 7)
 
(task '(1 2 3 4 5 6 7) 3 5)
 
==> (1 2 5 4 3 6 7)

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

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

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


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

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

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