Переставить 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)
Объяснение кода листинга программы
Код решает задачу перестановки двух элементов в списке, заданных по индексу. Список разбивается на три части: левая, средняя и правая. Индексы начала и конца переставляемых элементов определяются в соответствии с заданными индексами. Если индексы некорректны (равны или один больше другого), то они меняются местами и рекурсивно вызывается функция для решения задачи на подсписках. Если индексы корректны, то рекурсивно вызывается функция для получения двух подсписков: левого и правого. Затем, вставляются два элемента в середину списка, в соответствии с индексами, и рекурсивно вызывается функция для оставшихся подсписков. В итоге, функция возвращает измененный список.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д