Я хочу найти все атомы из дерева, расположенные на заданном уровне k. Я пытался что-то вроде:Lisp: список узлов на заданном уровне k
(defun atoms (l)
;returns the list of atoms of l at its superficial level
(cond
((null l) l)
((or (atom l) (numberp l)) l)
((or (atom (car l)) (numberp (car l)))
(append (list(car l)) (atom (cdr l))))
(T (atoms (Cdr l)))))
(defun findat (l pos k)
(cond
((null l) l)
((= k pos) (atoms l))
((and (or (atom l) (numberp l)) (= k pos)) l)
(T (cons '() (mapcar #'(lambda (l) (findat l (+ pos 1) k)) l)))))
так, для образца: л = (а (Ь (г)) (с (д (е)) (е))), поз = 0 и к = 2, я должен получить результат: (gdf), но вместо этого, я получаю некоторую ошибку, говоря, что «A не имеет тип LIST». Кто-нибудь знает, как исправить мой код? Заранее спасибо!
(1) Это еще один вопрос, когда вы говорите о «нелинейном списке». Я знаю [линейные/нелинейные структуры данных] (https://en.wikipedia.org/wiki/List_of_data_structures#Linear_data_structures), но я редко сталкиваюсь с нелинейными списками: это термин, используемый учителем или учебником? Я думаю, что вы зададите вопрос, если бы вы сказали «дерево». (2) Пожалуйста, правильно отпечатайте свой код (3) 'defun' четко идентифицирует ваш код как« common-lisp », обновите теги (4). Почему вы пишете« мой код »жирным шрифтом, как в вашем другом вопросе? Как вы узнаете об альтернативных (возможно, лучших) подходах? – coredump
Я использую термин «нелинейный», потому что так говорит мой учитель. С этого момента я попытаюсь использовать «дерево». Кроме того, вы правы в отношении проблемы «моего кода». , Я хочу сначала исправить свой код, и, конечно, я открыт для любых других решений. Спасибо за советы. – Nelly
'(или (atom x) (numberp x))' содержит избыточность. Все числа являются атомами Нет никакого способа, чтобы '(atom x)' мог терпеть неудачу, но '(numberp x)' success. – Kaz