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

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


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

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

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