> 1 <

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

diver92

Members


Статус

3 сообщений

Где: Russia Барнаул
Род занятий: iOS developer, студент
Возраст: 27

#5592   2012-01-25 16:33 GMT+3 часа(ов)      
Доброго времени суток!

Есть у меня такое задание:
Дан список произвольной структуры, каждый атом встречается по одному разу. Написать функцию, которая для каждого атома определяет его уровень вложенности и строит соответствующий список:
(A ((B) C)) —> ((A 1) (B 3) (C 2))

Собственно, проблема в том, чтобы правильно построить функцию.
Как ни старался, дошел вот только до этого:

(DEFUN ATD (LST)
(
loop for i in LST collect (LIST (FINDATOM i) (DEPTH i))
)
)

(DEFUN DEPTH (X)
(COND
( (atom X) 0 )
( T
(
(lambda (e1 e2) (if (> e1 e2) e1 e2) )
( 1+ (DEPTH (car X) ) )
(DEPTH (cdr X) )
)
)
)
)

(DEFUN FINDATOM (LST)
(COND
( (atom LST) LST )
( T (FINDATOM (car LST)) )
)
)

Но, как уже ясно, это работает неправильно. Нужна помощь.

bokunopico

Members


Статус

54 сообщений

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

#5593   2012-01-25 17:31 GMT+3 часа(ов)      
(defun f (lst &optional (n 0))
(cond ((null lst) nil)
((atom lst) `((,lst ,n)))
(t (append (f (car lst) (1+ n)) (f (cdr lst) n)))))
 
CL-USER> (f '(a ((b) c)))
((A 1) (B 3) (C 2))

diver92

Members


Статус

3 сообщений

Где: Russia Барнаул
Род занятий: iOS developer, студент
Возраст: 27

#5594   2012-01-25 17:52 GMT+3 часа(ов)      
Цитата
bokunopico :
(defun f (lst &optional (n 0))
(cond ((null lst) nil)
((atom lst) `((,lst ,n)))
(t (append (f (car lst) (1+ n)) (f (cdr lst) n)))))
 
CL-USER> (f '(a ((b) c)))
((A 1) (B 3) (C 2))




Большое спасибо!

А что такое &optional (n 0) ? Это таким образом обозначаются необязательные параметры?
И что значит выражение `((,lst ,n)) ?

bokunopico

Members


Статус

54 сообщений

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

#5595   2012-01-25 18:01 GMT+3 часа(ов)      
> Это таким образом обозначаются необязательные параметры?
Да.
> И что значит выражение `((,lst ,n))
Можно заменить на (list (list lst n)), но вариант выше короче. Это backquote и unquote, про них можно прочитать в PCL, например.
CL-USER> (setf c 3)
CL-USER> '(a b c)
(A B C)
CL-USER> `(a b ,c)
(A B 3)
CL-USER> (list 'a 'b c)
(A B 3)
> 1 <


Онлайн :

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




Реклама на сайте: