Написать программу для циклического сдвига списка на n-1 элементов влево - Lisp
Формулировка задачи:
Здравствуйте, помогите написать программу на Lisp
Написать программу для циклического сдвига списка на n-1 элементов влево (очень нужно)
Решение задачи: «Написать программу для циклического сдвига списка на n-1 элементов влево»
textual
Листинг программы
(defun task (lst n &optional (nn (rem n (length lst)))) (append (subseq lst nn) (subseq lst 0 nn))) ==> task (task '(1 2 3 4 5 6 7 8) 10) ==> (3 4 5 6 7 8 1 2) (task '(1 2 3 4 5 6 7 8) 1) ==> (2 3 4 5 6 7 8 1) (task '(1 2 3 4 5 6 7 8) 2) ==> (3 4 5 6 7 8 1 2) ;; Или так: (defun task (lst n) (if (zerop n) lst (task (append (last lst) (butlast lst)) (- n 1)))) ==> task (task '(1 2 3 4 5 6 7 8) 1) ==> (8 1 2 3 4 5 6 7) (task '(1 2 3 4 5 6 7 8) 2) ==> (7 8 1 2 3 4 5 6) (task '(1 2 3 4 5 6 7 8) 122) ==> (7 8 1 2 3 4 5 6)
Объяснение кода листинга программы
Код представляет собой функцию под названием task
, которая принимает два аргумента: lst
и n
.
В первом варианте кода функция реализует циклический сдвиг списка на n-1
элементов влево с помощью функций append
, subseq
и rem
.
Во втором варианте кода реализована рекурсивная реализация циклического сдвига списка на n
элементов влево с использованием функций if
, append
, last
, butlast
, zerop
и (- n 1)
.
Если n
равно нулю, то функция возвращает исходный список lst
.
Если n
больше нуля, то функция вызывает саму себя, обрезая список на n
элементов с обоих концов, и уменьшает значение n
на единицу.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д