2017-02-27 12 views
1
def eulerian_circuit(graph): 

    trail = [] 

    for edge in graph: 
     graph.sort() 
     a,b = edge 
     if not trail: 
      trail.append(a) 
      trail.append(b) 
      graph.remove((a,b)) 
      print(graph) 
     if a == trail[-1]: 
      trail.append(b) 
      graph.remove((a,b)) 
      print(graph) 
     if not graph: 
      return trail 

    eulerian_circuit(graph)    
    return trail,graph   

eulerian_circuit([('a','b'), ('b','c'), ('a','f'), ('b','d'), ('d','f'), ('b','e'), ('e','g'), ('c','g'), ('f','g'), ('f','h'), ('g','h')]) 

私の問題は、私は道= []で先頭にオイラー回路再帰文の

私のトレイルリセット再帰eulerian_circuit(グラフ)を呼び出すとき、ということです。これをどうやって回避するのですか?

(コードは回路解答のために未完成ですが、開始頂点に接続するために1つの端が残っている場合でも実装する必要があります...そして、他のエラーを見つけなければなりません。

答えて

-1

グローバル変数としてトレイルを作成し、 'global'キーワードを使用してeulerian_circuit関数内でアクセスすることができます。

trail = [] 
def eulerian_circuit(graph): 
    global trail 

    for edge in graph: 
     graph.sort() 
     a,b = edge 
     if not trail: 
      trail.append(a) 
      trail.append(b) 
      graph.remove((a,b)) 
      print(graph) 
     if a == trail[-1]: 
      trail.append(b) 
      graph.remove((a,b)) 
      print(graph) 
     if not graph: 
      return trail 

    eulerian_circuit(graph)    
    return trail,graph  
+0

をあなたが二回 'eulerian_circuit'呼び出す場合? –

+0

はい、それは問題になるでしょう、私はその機能でトレイルを渡すことをお勧めします。 –

0

あなたはeulerian_circuitのサブ呼び出しにパラメータとしてtrailを渡すことができます。

それは、トップレベルのコールだかどうかを知ることができるように機能をtrailためNoneのデフォルト値を与える:

def eulerian_circuit(graph, trail=None): 
    if trail is None: 
     trail = [] 
    ... 
    eulerian_circuit(graph, trail): 

使用法:

eulerian_circuit([('a','b'), ('b','c'), ('a','f')]) 
+0

ありがとうございました。「最大再帰」がエラーを超えました。私はb = trail [-1]を追加してから(a)とremove((a、b))を追加してみましたが、どちらもうまくいきませんが、(a、b)はそこにない削除する。 –

+0

もう、 'eulerian_circuit'をもう一度呼び出さないという条件はありません。 –

+0

オイラー回路アルゴリズムについては何も知らないので、コーディングの問題を助けています。 –

関連する問題