2016-07-08 4 views
1

インタビューでは、私は最近次のような質問をしています:2ノードが接続されているかどうかを示す再帰関数を作成しなければなりません。どのように私は下のコードを動作させることができますか? a、b、c 'を参照渡しする方法はありますか?'というようにインスタンス化されると、これはcheck_connectionを呼び出すときに効果的です。 Nodeは変更可能なオブジェクトなので、参照であるかのように動作するはずですが、 'NoneType is iterable'というエラーがあります。どんな提案も感謝しています。2つのノードが再帰関数で接続されているかどうかをチェックする方法

class Node(): 
    def __init__(self, neighbours): 
     self.neighbours=neighbours 

    def return_neighbours(self): 
     return self.neighbours 

def check_connection(first, second): 
    connections=first.return_neighbours() 
    for conection in connections: 
     if second in conection: 
      return True 
     else: 
      check_connection(conection,second) 

a=None 
b=None 
c=None 

a=Node(neighbours=[c]) 
b=Node(neighbours=[c]) 
c=Node(neighbours=[a,b]) 

check_connection(a,c) 
+0

あなたは再帰的に '他にcheck_connection''を呼び出すとき: 'ブロック、あなたはその値を_returning_ていません。あなたはそれを呼び出した後に戻り値を返すだけです。つまり、関数には 'return'文が全くありません。つまり、デフォルトで' None'を返します。 –

+0

それは再帰的な関数なので、それは問題だとは思わない。 – Nickpick

+0

'check_connection'がその結果をどのように通知するのかは不明です。 2番目のノードがネイバーリストにある場合は 'True'を返します。したがって、これは常に' True'または 'False'を返すことを意味します。しかし、2番目のノードがネイバーリストにない場合は何も返しません(したがって 'None')、スクリプトの最後に呼び出されたときには戻り値もキャプチャされません。その結果をアナウンスする関数(おそらくあなたが残した 'print'ステートメント?) –

答えて

1

問題は、可変オブジェクトではないことです。 a、b、cをNoneに設定するのではなく、隣人のないノードに設定する必要があります。そうすれば、彼らはその後の宣言によって変更されるでしょう。あなたが現在持っているので、cの隣人はcではなくむしろNoneです。なぜなら、cはその時点でNoneを指す変数であり、Nodeオブジェクトへの参照ではないからです。

0

これは動作するようです:

class Node(): 
    def __init__(self): 
     self.neighbours=None 

def check_connection(first, second): 
    if second in first.neighbours: 
     print ("Connection found") 
     exit() 
    else: 
     for conection in first.neighbours: 
      check_connection(conection,second) 

a=Node() 
b=Node() 
c=Node() 

a.neighbours=[c] 
b.neighbours=[c] 
c.neighbours=[a,b] 

check_connection(a,c) 
関連する問題