2017-07-20 14 views
0

したがって、xはネストされたリストtで探している値です。私はコードとリストの理解を通して何が起こるのか理解していますが、私が理解していないことはどの点で経路になり、[3,5]が経路になり、最終的に[1,3,5]最終的な値のパス。ここで任意のネストされたリストを検索してパスを返す(Python)

def findPath(t, x): 
    if t[0] == x: 
     return [t[0]] 
    for path in [findPath(branch, x) for branch in t[1:]]: 
     if path: 
      return [t[0]] + path 

t = [1, [3, [4], [5]], [2]] 

findPath(t, 5) 
#returns [1,3,5] 
findPath(t, 2) 
#returns [1 ,2] 

は私がステップバイステップを理解する助けたリンクで、私はちょうどリストは最終的に[T [0]] +パスを復路どうなるか分かりません。 https://でgoo.gl/ZRrZv7

答えて

1

このようなツリー構造であるとtを想像して:あなたは、ツリーをトラバースする各パスを模索し続ける

[1, [3, [4], [5]], [2]] 

      || 

       1 
      / \ 
      3  2 
     /\ 
     4 5 

。デッドエンドはNoneを返すので、if pathはデッドエンドの場合はFalseです。探しているパスが見つかると(例:5)、[5]が返されます。 pathNoneではないので、if pathTrueです。したがって、t[0] + [5] = [3, 5]を返します。同様に、上記のレベルでは[3, 5]Noneではないため、t[0] + [3, 5] = [1, 3, 5]を返します。パスが見つからない場合は、何も返されません(正確にはNoneが返されます)。

2番目の例でも同じ理由があります。

0

私はここに、私は一般的によく使用されるウェブサイトのためではありませんリンクをたどりませんので、リンクをたどるが、しませんでしたが、何が起こるかの説明です:

t = [1, [3, [4], [5]], [2]] 

スタックレベル(0)で我々呼び出し:

findPath(t, 5) 

これは、と評価されます。私たちは、STA

findPath([1, [3, [4], [5]], [2]], 5) 

0)をt[0]にチェックしてください。リスト(<stack level><current index>)の表記でこれを表します。ここでは(0: 0)となります。

この時点では、t[0]xと等しくないので、if文のun-specified else条件に入り、forループの次の繰り返しに移ります。[0] T、再び

findPath([3, [4], [5]], 5) 

:私たちは、現在のスタックレベル(0: 1)にインデックスをインクリメントし、私たちが呼んで(0: 11: 0)の状態を、与える、別のスタックレベル(1)を追加しますxと等しくないので、我々は(0: 11: 1)に現在のスタックレベルでのインデックスをインクリメントして(0: 11: 12: 0)をしようとする別のスタックレベルを追加し、その私たちが呼んでます:ここで

findPath([4], 5) 

t[0]xと等しくなく、t[1:]が空であるため、スタックレベルからスタックレベル(1)に戻って、中止したところから取り上げます。このレベルのカウンタを(0: 1,1: 2)に増やしてから、スタックレベルを追加します(0: 11: 22: 0)。これにより、電話番号: findPath([5]、5)

Aha!今すぐt[0]は最大スタックレベルでxに等しいので、[t[0]]を構成します。これは[5]と評価されます。それから私たちはスタックレベルに戻り、中止したところから取り上げます。私たちは(0: 11: 2)にいました。今度はfindPathが値を返したので、最初のif条件になり、次の繰り返しに落ちることはありません。したがって、現在のスタックレベルでt[0]を取得し、それに戻り値を追加します。これは、[5][3]に追加すると評価され、[3,5]となります。

次に、再び(0: 1)に戻り、プロセスを繰り返します。今度は[3,5][1]を追加する必要がありますので、[1,3,5]となります。

これは意味がありますか?私は絵を描くのに時間を費やしたくないので、ここで奇妙な表記をしましたが、実際にこれを理解するためには、スタックレベルを自分で描くべきです。

関連する問題