> 1 <

Автор Сообщение

abelix

Members


Статус

2 сообщений

Где: Ukraine
Род занятий:
Возраст:

#5358   2011-12-18 19:08 GMT+3 часа(ов)      
Используя приемы рекурсии в Лиспе, выполнить следующие преобразования: получая, в качестве исходного, любой многоуровневый список вида
(abc (d (ef (ghij &񗜻&񗜻(k (nil) 1 2) 3) 4) 5 6) 7 8 9 10)
образовать результирующий список вида
(7 8 9 10 (d (4 (gh и j (1 2 (nil) k) 3) ef) 5 6) abc)
то есть, в каждом нечетном уровне все элементы, стоящие впереди единого подсписка данного уровня, переместить (не меняя порядка их следования) за подсписок, а те, что стоят после подсписка, - аналогичным образом переместить в позиции предшествующих подсписка. Парные уровне списка остаются в неизменном виде.


вот моя наработка
функцию main никак не могу составить

(setq x '(a b c(d (e f(g h i j(k (nil)1 2) 3) 4) 5 6)7 8 9 10))
(setq y '(4 5 6(p o r 9 d o k)1 2 3))
(setq lvl 0)
 
(defun spk?(in);возвращает подсписок из списка
(if (null in)
(setq in nil)
(if (atom(car in))
(spk? (cdr in))
(setq in (car in))
)
)
)
(defun R=>(in) ;все что слевой части списка
(if (atom(car in))
(cons (car in)(R=> (cdr in)))
)
)
 
(defun L=>(in) ;все что справой части списка
(reverse(R=>(reverse in)))
)
 
 
(defun R<=>L(in) ;меняем правую часть на левую
(if (spk? in)
(append(append(L=> in) (list(spk? in)) ) (R=> in))
(setq in (spk? in))
)
 
)
 
(defun main(in)
(if (spk? in)
(progn
(setq lvl (+ lvl 1))
(setq in (if (= (rem lvl 2) 1)
( princ (R<=>L(main in)))
( princ (spk? in))
)
)
)
(setq in (spk? in))
)
)

megamanx

Members


Статус

307 сообщений

Где: Russia
Род занятий:
Возраст:

#5360   2011-12-18 21:56 GMT+3 часа(ов)      
(defun foo(L)
(labels ((ret (L R n)
(cond
((null L) R)
((atom (car L)) (ret (cdr L) (append R (cons (car L) nil)) n))
(T (if (evenp n)
(append R (list (ret (car L) nil (1+ n))) (cdr L))
(append (cdr L) (list (ret (car L) nil (1+ n))) R))))))
(ret L nil 1)))
I wish I'd made you angry earlier
> 1 <


Онлайн :

0 пользователь(ей), 38 гость(ей) :