Étant donné un arbre, je veux trouver les chemins de la racine à chaque feuille.Trouver tous les chemins de la racine aux feuilles de l'arbre dans le schéma
Ainsi, pour cet arbre:
D
/
B
/\
A E
\
C-F-G
a les chemins suivants de la racine (A) à feuilles (D, E, G):
(A B D), (A B E), (A C F G)
Si je représente l'arbre ci-dessus (A (B D E) (C (F G)))
alors la fonction g
le tour est joué:
(define (paths tree)
(cond ((empty? tree)
'())
((pair? tree)
(map (lambda (path)
(if (pair? path)
(cons (car tree) path)
(cons (car tree) (list path))))
(map2 paths (cdr tree))))
(else
(list tree))))
(define (map2 fn lst)
(if (empty? lst)
'()
(append (fn (car lst))
(map2 fn (cdr lst)))))
Mais cela semble tout faux. Je n'ai pas eu à faire ce genre de réflexion depuis un moment, mais je pense qu'il devrait y avoir une façon plus simple de le faire. Des idées pour une meilleure solution (dans n'importe quelle langue) seraient appréciées.
EDIT - La solution de cartographie Svante dans le schéma donne:
(define (paths tree)
(if (pair? tree)
(append-map (lambda (node)
(map (lambda (path)
(cons (car tree) path))
(paths node)))
(cdr tree))
(list (list tree))))
qui est beaucoup plus propre que mon original.
C'est un peu plus propre - et probablement plus correct, étant donné qu'il traite un arbre avec un seul noeud: (paths 'a) => ((a)), tandis que (g 'a) => (a). Est-ce que la carte de CL est plus ou moins équivalente à ma map2 ci-dessus? Connaissez-vous une fonction Scheme intégrée? – grifaton
Je ne sais pas grand-chose sur Scheme, mais j'aurais deviné que quelque chose comme mapcan est disponible. Peut-être que cela est considéré comme simple à mettre en œuvre, cependant. Votre 'map2' semble équivalent en principe, mais il a un mauvais appel de queue, donc il va sauter la pile quand la liste est trop longue. Peut-être que vous devriez utiliser l'accumulateur/idiome inverse. – Svante
L'équivalent du schéma 'mapcan' est" append-map "de SRFI-1. –