É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
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? –
En Lisp, vous pouvez écrire 'list' au lieu de 'lst'. –
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 –