トポロジカルソート、再帰的、ジェネレーターを使用
質問
データ:非循環であることがすでに検証されている依存関係リスト。したがって、ここでは、「a」は「b」、「c」に依存します(cはdに依存します)、など...
A = { 'a' : dict(b=1, c=1),
'c' : dict(d=1),
'd' : dict(e=1,f=1,g=1),
'h' : dict(j=1)
}
「A」から始まるチェーンを見つけましょう。a、c、d、e、g、f、b
したがって、現時点では (ジェネレーターを使用しないソリューション):
def get_all(D,k):
L = []
def get2(D,k):
L.append(k)
for ii in D.get(k,[]):
get2(D, ii)
get2(D,k)
return L
明らかに、これはかなり弱いです :) 私は、この中でどうやって収量を得るのかについて頭を悩ませてきました。皆さんがこれについて教えていただけると幸いです。
解決
これを試して:
#!/usr/bin/env python
def get_all(D, k):
yield k
for ii in D.get(k, []):
for jj in get_all(D, ii):
yield jj
A = { 'a' : dict(b=1, c=1),
'c' : dict(d=1),
'd' : dict(e=1,f=1,g=1),
'h' : dict(j=1)
}
for ii in get_all(A,'a'):
print ii
くれます
steve@rei:~/code/tmp $ python recur.py a c d e g f b
他のヒント
どちらの答えも同じ結果になりますが、私の質問の解釈が正しければ、与えられたグラフへの単純な変更に対して間違った答えが得られます。「b」から「c」への依存関係を追加した場合(これはサイクルを導入しません)グラフの方向に従って)出力は次のようになります。
a
c
d
e
g
f
b
d
e
g
f
それはまったく役に立ちません。グラフのどのノードがすでに訪問されているかを追跡する、次の小さなバリエーションを試してください。
def get_all(D, k, seen=None):
if not seen:
seen = set( )
if k not in seen:
seen.add(k)
yield k
for ii in D.get(k, []):
for jj in get_all(D, ii, seen):
yield jj
所属していません StackOverflow