2016-11-24 14 views
2

私は(0、0)から(x、y)までグリッドを移動するときにパスを保存するパラメータとして配列を持つ再帰関数を持っていますそして私は、私が最後にpathをプリントアウトするように、このPython - 再帰関数への変数パスの範囲を理解してください

unAvailablePoint = [(1, 2), (3, 0), (0, 3), (2, 3), (0, 1)] 

def steppable(point): 
    return point not in unAvailablePoint 

def travel(x, y, path, visited): 
    if x >= 0 and y >= 0 and steppable((x, y)): 
     if (x, y) in visited: 
      return visited[(x, y)] 
     success = False 
     if (x, y) == (0, 0) or travel(x-1, y, path, visited) or travel(x, y-1, path, visited): 
      path = path + [(x, y)] #the path will remain empty even after the recursive call have done some changes to the path 
      success = True 
     visited[(x, y)] = success 
     return success 
    return False 

path = [] 
visited = {} 
travel(3, 3, path, visited) 
print(path) //[] 

のように「利用不可」

私は実装私の関数として定義されているいくつかのポイントをスキップする必要があり、pathはまだ空であるようです。これは私がPythonの初心者として期待したものではありません。

path.append((x,y)) #the path will remain empty even after the recursive call have done some changes to the path 

代わりに:任意の提案は、パスに追加し、再帰の反復ごとにそれを初期化しないようにしてください役立つ

+0

あなたの旅行関数は 'True' /' False'のみを返すので、 'path'の変更はその再帰ステップの範囲にとどまります。 – Fejs

+0

これはJavaで異なります。これは、再帰的なステップが進むにつれてパラメータを変更できるようにします。それを追跡すると、呼び出し元は子の再帰的ステップに渡すパラメータの更新値を取得できるはずです。 –

答えて

3

だろう

path = path + [(x, y)] #the path will remain empty even after the recursive call have done some changes to the path 

をこのように、あなたが初期化されていません各繰り返しをリストするので、関数のローカル変数にはなりません。

+0

それは動作します。しかし、 'path = path + [(x、y)]'を使ってリストを再初期化するのはなぜですか? –

+1

'path = path + [(x、y)]'が関数内にあるため、これを実行すると、travel関数のローカル変数としてパスが作成されます。 appendを使うと、関数内でパスが初期化されていないことを確認して、関数のローカル変数にならないようにします。 @KesongXie –

+1

もう一つの解決策: 'path + = [(x、y)]' – MarianD

関連する問題