Написать программу для циклического сдвига списка на 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 на единицу.