Определить уровень искомого элемента - PullRequest
4 голосов
/ 23 ноября 2010

Имеется список / дерево в форме: (узел1 (узел2) (узел3 (узел4) (узел5)) (узел6)) Я должен быть в состоянии выяснить глубину, на которой находится искомый узел.

Это то, что я сделал до сих пор:

(defun search-it (lst level n)
   (cond ((null lst) nil)
         ((and (atom (car lst)) (equal (car lst) n)) level)
         ((atom (car lst)) (search-it (cdr lst) level n))
         (t (cons (search-it (car lst) (+ 1 level) n)
                  (search-it (cdr lst) level       n)))))

(defun search-node (l n)
   (search-it l 0 n))

Для этой конкретной реализации у меня есть правильное решение, но меня беспокоит то, что я не могу избавиться от некоторых нулевых списков. Например:

 (search-node '(1 (2) (3 (4) (6) (7) (8 (9) (10)))) 6)
 (NIL (NIL 2 NIL (NIL NIL)))

Решение будет правильным, если мы рассмотрим корневой узел на глубине 0. Теперь, конечно, я мог бы добавить код в функцию search-node , чтобы удалить все, кроме решений, я не могу не чувствовать, что это не самый элегантный способ сделать это.

LE : ожидаемый результат должен быть глубиной или списком глубин, если число появляется более одного раза.

Кто-нибудь указывает на кого-нибудь? PS: lisp newbie

1 Ответ

2 голосов
/ 23 ноября 2010

Обычно возвращает список глубин.Итак, если элемент найден, то вернуть список одной глубины.Если вы переходите к первому и остальному списку, то не «против», а «добавить».

Обратите внимание, что ваш код не находит все глубины.

...