/ / Określ poziom szukanego elementu - seplenienie, seplenienie

Określ poziom wyszukanego elementu - seplenienie, typowe seplenienie

Biorąc pod uwagę listę / drzewo postaci: (node1 (node2) (node3 (node4) (node5)) (node6)) Powinienem być w stanie dowiedzieć się, na jakiej głębokości znajduje się szukany węzeł.

Oto, co zrobiłem do tej pory:

(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))

Dla tej konkretnej implementacji mam poprawne rozwiązanie, ale przeszkadza mi to, że nie mogę pozbyć się niektórych zerowych list. Na przykład:

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

Rozwiązanie jest poprawne, jeśli weźmiemy pod uwagę węzeł główny na głębokości 0. Teraz oczywiście mogę dodać trochę kodu do węzeł wyszukiwania aby usunąć wszystko oprócz rozwiązań, nie mogę pomóc, ale czuję, że nie jest to najbardziej elegancki sposób na zrobienie tego.

LE: Oczekiwanym wynikiem powinna być głębokość lub lista głębokości w przypadku, gdy liczba pojawi się więcej niż jeden raz.

Jakieś wskazówki ktoś? PS: nowi lisp

Odpowiedzi:

2 dla odpowiedzi № 1

Generalnie zwraca listę głębokości. Tak więc, jeśli element zostanie znaleziony, zwróć listę pojedynczej głębokości. Jeśli przejdziesz do pierwszej i reszty listy, nie „t” przeciw ”, ale„ dołącz ”.

Zauważ też, że twój kod nie znajduje wszystkich głębi.

CL-USER 6 > (search-node "(6 (6)) 6)
0