Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > LISP > подскажите как решить задачу!


Автор: чайник11 10.9.2009, 23:37
Дан список (слово). Сделать циклическую перестановку на k элементов вправо


то есть было так: 1 2 3 5
после двух прогонов получится так: 3 5 1 2 

Автор: VH_ 11.9.2009, 14:49
Код
(defun F (L K)
 (cond
  ((null L) nil)
  ((minusp K) L)
  ((zerop K) L)
  (T (F (cons (last L) (butlast L)) (1- K)))))

в некоторых диалектах (last) возвращает не последний элемент списка, а последнюю точечную пару (элемент . nil), в этом случае следует использовать конструкцию
Код
(cons (car (last L)) (butlast L))

Автор: _sg 25.4.2014, 09:52
как вариант:
Код

(defun rotate> (w n)
  (if (zerop n) w (rotate> (nconc (last w) (butlast w)) (1- n))))
 
> (rotate> '(1 2 3 4 5) 2)
(4 5 1 2 3)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)