2010-11-22 5 views
4

Étant donné une liste/arborescence de la forme: (node1 (node2) (node3 (node4) (node5)) (node6)) Je devrais pouvoir trouver la profondeur à laquelle un nœud recherché réside.Déterminer le niveau de l'élément recherché

C'est ce que je l'ai fait jusqu'à présent:

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

Pour cette application particulière, j'ai une bonne solution, mais ce qui me dérange est que je ne peux pas me débarrasser de certaines listes nulles. Par exemple:

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

La solution est correcte si l'on considère le noeud racine en profondeur 0. Maintenant, bien sûr, je pourrais ajouter du code à la fonction recherche nœud pour supprimer tout sauf les solutions, je peux Mais ne sentez pas que ce n'est pas la façon la plus élégante de le faire.

LE: Le résultat attendu devrait être la profondeur ou une liste de profondeurs au cas où le nombre apparaîtrait plusieurs fois.

Quelques pointeurs? PS: lisp newbie

+0

Quel type de résultat voulez-vous? Une liste de profondeurs? Une seule profondeur? Que faire si l'objet est trouvé dans plus d'un endroit? –

+0

En Lisp, vous pouvez écrire 'list' au lieu de 'lst'. –

+0

Liste des profondeurs si l'élément apparaît une fois. @Rainer Joswig: Je sais, mais lst ou l tend à être moins confus pour moi –

Répondre

2

Retourne généralement une liste de profondeurs. Donc, si un élément est trouvé, retournez la liste de la profondeur unique. Si vous vous connectez au premier et au reste de la liste, ne faites pas «contre», mais «ajoutez».

Notez également que votre code ne trouve pas toutes les profondeurs.

CL-USER 6 > (search-node '(6 (6)) 6) 
0 
+0

Merci fonctionne comme un charme –

Questions connexes