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