![]() |
|
|
#1 (permalink) |
|
Новичок
|
muLisp. Циклическая перестановка элементов списка.
Только начал знакомиться с языком Lisp. Требуется сделать несколько заданий по поводу циклической перестановки элементов списка. Наверное, задача простая, прошу прощения за тупые вопросы, помогите плиз. Компилятор muLisp. А задания следующие:
1) организовать перестановку с помощью простой рекурсии без обработки подсписков Пример: (a b c d)->(d a b c) Не совсем понимаю зачем здесь вообще нужна рекурсия, но преп требует. Мой вариант (первое, что пришло на ум) Код:
(Defun EndFirst (S kolvo)
(Cond ((ATOM S) 'incorrect_argument)
((NOT (Cdr S)) S)
((NOT (= 0 kolvo)) (EndFirst (Append (Last S) (SubList S 0 (- (Length S) 2))) (- kolvo 1)))
(t S)
)
)
2) организовать перестановку с обработкой подсписков Пример: ((a b) c (d e f) -> ((f d e) (b a) c) Мой вариант: Код:
(Defun EndFirst2 (S kolvo)
(Cond ((ListP (Car S)) (Endfirst (Cons (EndFirst (Car S) kolvo) (EndFirst2 (Cdr S) kolvo)) kolvo))
(t (EndFirst S kolvo))
)
)
3) Определить функцию, осуществляющую все циклические перестановки элементов в списке. Сделать при помощи рекурсии. Пример: ((a b) (c d)), ((b a) (c d)), ((a b) (d c)) и т. д. 4) Задание как в 3-ем пункте, но сделать с помощью цикла Loop. Помогите, пожалуйста. |
|
|
|
|
|
#2 (permalink) |
|
Новичок
|
вроде справился с заданиями 1 и 2.
вот мои варианты на случай, если кому-нибудь понадобятся. 1) Код:
(Defun endfirst (S x)
(Cond ((NOT (Cdr S)) (Cons (Car S) x))
((NULL x) (endfirst (Cdr S) (Cons (Car S) Nil)))
(t (endfirst (Cdr S) (Append x (Cons (Car S) Nil))))
)
)
(Defun ef (S)
(endfirst S Nil)
)
Код:
(Defun endfirst (S x)
(Cond ((AND (NOT (Cdr S)) (ATOM (Car S))) (Cons (Car S) x))
((AND (NOT (Cdr S)) (NOT (ATOM (Car S)))) (Cons (endfirst (Car S) Nil) x))
((AND (NULL x) (ATOM (Car S))) (endfirst (Cdr S) (Cons (Car S) Nil)))
((AND (NULL x) (NOT (ATOM (Car S)))) (endfirst (Cdr S) (Cons (endfirst (Car S) Nil) Nil)))
((ATOM (Car S)) (endfirst (Cdr S) (Append x (Cons (Car S) Nil))))
(t (endfirst (Cdr S) (Append x (Cons (endfirst (Car S) Nil) Nil))))
)
)
(Defun ef (S)
(endfirst S Nil)
)
|
|
|
|
|
|
#3 (permalink) |
|
Местный
Регистрация: 03.03.2007
Адрес: Москва, Люблино
Возраст: 33
Сообщений: 946
|
Я не знаю в Рязани ни одного человека, который программирует на Lisp.
|
|
|
|
|
|
#4 (permalink) |
|
Новичок
|
Да собсна и не собираюсь как-то связывать свою дальнейшую жизнь с ним, просто лабы надо сделать. В радике учусь.
|
|
|
|
|
|
#5 (permalink) | |
|
Местный
Регистрация: 03.03.2007
Адрес: Москва, Люблино
Возраст: 33
Сообщений: 946
|
Да это понятно. Я имел в виду
Цитата:
![]() |
|
|
|
|
|
|
#6 (permalink) |
|
Новичок
|
sp0_of, спасибо за совет. Собсна уже сдал, так что надобности в функции на Common Lisp нет. А преподают всего один семестр на ФВТ, 3-ий курс, 43-я группа. Преподает Парфилова Надежда Ивановна.
Последний раз редактировалось RUSLAN555, 28.05.2010 в 20:26. |
|
|
|
|
|
#7 (permalink) |
|
Новичок
|
Возник еще один вопрос. Необходимо определить функцию, возвращающую номер последнего вхождения элемента a в список L. надо реализовать двумя способами: использованием рекурсии и цикла Loop. Проблема опять же в обработке подсписков. Необходимо сделать, чтобы подсписки тоже учитывались. То есть по вызову (ln '(a (a b) a (b a) v) 'a) функция должна возвращать 6. Прошу, помогите чайнику пожалуйста.
Смог сделать только без обработки подсписков: Код:
(defun ln (L a)
(lastnum L a 0)
)
(defun lastnum (L a x)
(Cond ((NOT (Member a L)) x)
((Member a L) (lastnum (Cdr (Member a L)) a (+ x (- (Length L) (Length (Member a L))) 1)))
)
)
|
|
|
|
![]() |
| Тэги |
| mulisp., перестановка, списка., циклическая, элементов |
| Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
| Опции темы | |
| Опции просмотра | |
|
|