私はこのコードを持っています:
(define tree `(A (B (C)) (D (E)) (C (E))))
(define (prog1 graph)
(let ([seen `()])
(define (sub g)
(cond
[(member (car g) seen) `()]
[else
(set! seen (cons (car g) seen))
(cond
[(null? (cdr g)) (list (car g))]
[else
(cons (car g) (map sub (cdr g)))])]))
(delete `() (sub graph))))
(define delete
(lambda (x y)
(if (null? y )
`()
(if (eqv? (car y) x)
(delete x (cdr y))
(cons (car y) (delete x (cdr y)))))))
すべてのノードが 1 回表示される接続グラフを出力します。
ランニング(prog1 tree)
プリント:(A (B (C)) (D (E)))
私はLispでさまざまな深さ優先検索(私がやろうとしていることと似ているもの)を見てきましたが、それらはこれよりもはるかにエレガントに見え、反復アプローチを使用しているものもあります。プログラムがあまり効率的ではないことは承知しています (巨大なツリーでは実行速度がかなり遅くなります)。このコードの効率を改善するにはどうすればよいでしょうか?
ありがとう、ジェームズ