2017-03-28 7 views
3

私はこの1つの関数def friends(self, name, degree):を使用して再帰関数を頭に入れようとしています。この1つの目的は、すべての友人の集合を特定の程度まで(アドレス帳のために)返すことです。それはclass SocialAddressBook:と呼ばれる大きなクラスの最後の部分です。このクラスの「程度」は、ユーザーが友人の友人に「質問」することを可能にします。度1は直接の友人であり、次数2は友人の友人であり、以下同様です。再帰的に設定を追加する

推移友情::私が持っているコードはまた、いくつかのより多くのコンテキストこの上の私の知識が行く限りで

def friends(self, name, degree): 
    fs = set() 
    if degree == 0: 
     return set() 
    if degree == 1: 

.... ある

Fred → Barb → Jane → Emma → Lisa 
Fred → Sue 
       Jane → Mary 

と私のテストは:a.friends('Fred', 1) == {'Barb', 'Sue'}

です。

a.friends('Fred', 3) == {'Mary', 'Barb', 'Jane', 'Sue', 'Emma'}

a.friends('Fred', 4) == {'Barb', 'Emma', 'Mary', 'Lisa', 'Sue', 'Jane'}

それだけで私はそれがに上がる度を知っているので、SO、私も再帰的にまたはちょうどこれを手動で行う必要がある度4 に上がりますか?

誰かがこれを再帰的に完了する方法について正しい方向で私を指すことができれば、それはすばらしいでしょう、ありがとう!

+0

直接質問には回答しませんが、これは(ストレージとしてのキューを使用して)Googleの「幅広い最初の検索」をお勧めします。再帰は深度の最初の検索(コールスタックを「ストレージ」として使用)に適しています。 – wim

+0

私はあなたがここで何を求めているのか完全にはわかっていない、多分あなたは私のために精巧にすることができます。しかし、私はあなたが探している答えは「再帰的にはメモリ上のものではないだろう」(再帰的に高速化する一方で、数ギガバイトのデータを持たない限り、これは本当に重要ではない)だから私はあなたが大量のデータを持っていない限り、あなたはマニュアル辞書を持っていることをお勧めします。 –

+0

@PrestonHager hmmmこのケースで再帰を使用する方法についてはほとんど混乱していると思います(テストケースをハードコードすることができないので、私はより簡潔に編集します)。しかし、ええ、メモリやスピードは、この場合、実際問題ではありません。 – plshalp

答えて

2

私は繰り返しこれを行うには言う:ただ、それは現在のリストにn個は、入力パラメータであるのn回、友人を追加します。

fs = set(self) 
for i in range (n): 
    wider = set() 
    for chum in fs.copy(): 
     for new_chum in chum.friend_list: 
      fs += new_chum 

各レベルで、現在のセットの友人からより広いセットを作成します。一度それらのすべてを通過したら、それらを友人セットに加えてください。繰り返すN回。

+0

'wider'を削除し、' fs'に直接追加するだけで簡単にできます。また、 'fsのチャム:' :) – TemporalWolf

+0

** **修正**ありがとう。直接追加することは、私たちが望むやり方ではうまくいかないでしょう:私たちがそれを繰り返す間に** fs **を変更します。 – Prune

+0

ああ、公正なポイント... fs.copy()の 'chumのために使うこともできますが: – TemporalWolf

2

これを繰り返し行うのが最善です。

def get_friends_iteratively(self, name, degree) 
    if degree < 0: 
     raise ValueError('degree should be an int >= 0') 
    if degree == 0: 
     return set() # no friends of degree 0! 
    friends = self.friends 
    for _ in range(degree): 
     new_friends = set() 
     # it is important not to change a set while we iterate through it. 
     # thus, we change new_friends, then update friends when we are done. 
     for other_person in self.friends: 
      new_friends |= other_person.friends 
     friends |= new_friends 
    return friends 

    # In python, the |= ('in-place or') operator updates a set with 
    # the union of itself and another set. 
+0

マイナーニックピック: 'TypeError'は不正な型を意味します。この場合、' ValueError'は適切な例外になります。あなたの例外メッセージで '> = 0'を意味すると思います。 – TemporalWolf

+0

ありがとう - 私は適切な編集を行います。 –

関連する問題