(defun find-all-paths (graph start &optional (path-queue (list (list start)))) (if (null path-queue) nil (let* ((path (first path-queue)) (new-nodes (new-nodes path graph))) (if (null new-nodes) (cons (reverse path) (find-all-paths graph start (rest path-queue))) (find-all-paths graph start (append (new-paths new-nodes path) (rest path-queue))))) ))行なっていることは,path-queueに,これからまだチェックしなければ ならないpathのリストを与えます. pathの先頭に隣接し,すでにpathの中に含まれている頂点を除いた new-nodesを求め, それがなにもなければ探索木の末端(葉)にきているということで, その時のpathを根が先頭に来るように並べ変えて(reverse)残りの path-queueに対してfind-all-pathsしたものに加えます. new-nodesがある場合には,残りのpath-queueにnew-pathsを加え合わせ (append)たあたらしいpath-queueを作り,find-all-pathsを 呼びます.
<cl> (setq *tree1* (find-all-paths *graph1* 's)) ((S D E F) (S D E B C) (S D E B A) (S D A B E F) (S D A B C) (S A D E F) (S A D E B C) (S A B E F) (S A B E D) (S A B C)) <cl> (find-all-paths *graph2* 's) ((S A B C) (S A B E D) (S A B E F) (S A D E B C) (S A D E F) (S D A B C) (S D A B E F) (S D E B A) (S D E B C) (S D E F)) <cl> (find-all-paths *graph3* 's) ((S A B C) (S A B E D) (S A B E F) (S A D E B C) (S A D E F) (S D A B C) (S D A B E F) (S D E B A) (S D E B C) (S D E F))同一の頂点から得られるneighborsはいつも変わりませんが,new-nodesの方は 現在のpathに依存して変わってしまうため,各頂点に付加的にこのnew-nodes 情報を覚えておかずに,path-queueの中にpathの形でどんどん付け加えるとい う方法をとっています.path-queueがなくなれば,再帰的にpathデータを作り つつ戻ります.