2017-05-16 12 views
0
def foo(): 
    l = [0, 0, 0] 
    for i in range(3): 
     l[i] = random.random() 
     for j in l: 
      if j > 0.5: 
       for i in range(3): 
        l[i] = random.random() 
       foo() 
      else: 
       print("Returning...") 
       return None 
     return None 

私の再帰関数はリストを変更しますl。再帰呼び出しは、反復処理中にlにネストされます。問題は、ネストされた呼び出しから戻ったときに、forループが反復しているリストが異なるものになることです(ネストされた呼び出し中にlが上書きされるため)。再帰関数py3で変数が変更されました。

例:foo()の最初の実行時にl = [0.7, 0.5, ...]、次にj = 0.7lfoo()の最初のネストされたコールで l = [0.3, 0.86, ...]になると仮定します。 foo()が返された場合、値0.5を取得するにはjが必要ですが、その間にlが上書きされているために発生しません。だから、

、どのように私は同時に、反復がlに始まると、それはその最後まで同じリスト上で行われていることを確認してください、私の再帰関数でリストlを(変更)して使用することができますか?

+0

申し訳ありません....ループのために、コールがfoo()、ではないのfoo(カウント) – emettelatripla

+0

あるにあなたのを編集することができます'count'を投稿して削除します。編集リンクは投稿テキストのすぐ下にあります。 –

+0

再帰でリストを変更していません。 –

答えて

1

他のコメンテーターが指摘したように、詳細な情報なしで具体的なアドバイスをするのは難しいです。しかし、あなたの質問のキーポイントを渡し、私はあなたがパラメータとして各再帰呼び出しにリストlを渡して調べる必要があり、fooの結果として各変更を返すと言うでしょう。これは、各再帰呼び出しが計算全体を通じて「同じ」リストで動作し、最終的に最上位レベルで回答を返すことができたことです。

1

この機能が何をするべきかわからないときは、ロジックを修正するのは難しいです。関数が何をするか注釈を付けましょう、そしてあなたはあなたの論理的なエラーを見ることができることを願っています:

def foo(): 
    # Create a local list l 
    l = [0, 0, 0] 

    # Ignore those initial zeroes; 
    # replace each in turn with a random number 
    for i in range(3): 
     l[i] = random.random() 

     # Grab the next number in the list; 
     # this is the one we just generated. 
     for j in l: 
      # If that number is greater than 1/2, 
      # rewrite the entire local list. 
      # Then recur on foo. 
      if j > 0.5: 
       for i in range(3): 
        l[i] = random.random() 
       foo() 
      # If any element of the rewritten list is less than 1/2, 
      # return now. 
      else: 
       print("Returning...") 
       return None 
     return None 
関連する問題