2017-02-13 8 views
3

私は以下のコードとかなり混乱しています。
変数はどのように格納され、Pythonの再帰関数で扱われますか?

def a(x): 
    print(x)  
    if x > 0: 
     a(x - 1) 
    print(x) #I am confused with this print statement 

a(5) 

上記のコードの出力:0までアップ

5 
4 
3 
2 
1 
0 
0 
1 
2 
3 
4 
5 

は、私はそれが印刷さを理解する、しかしそれは昇順に印刷し、なぜ。
変数xが変更されているので、出力がで最後に割り当てられた値xの値は0です。
私は出力を予測:

5 
4 
3 
2 
1 
0 
0 
0 
0 
0 
0 
0 

それでは、どのように、xの値がそれトラックん...?
の説明実際に何が起こるか再帰関数変数が格納されています。

+0

変数 'x'は変更されません。各関数呼び出しには独自の' x'があります。 –

+1

これは、関数が再帰的であることとは関係ありません。 'x - 1'で関数を呼び出すことは、現在のスコープ内の' x'の値を変更しません。あなたはhttp://pythontutor.com/有用であるかもしれません。 – jonrsharpe

+1

ここでは、スタックについて少しお読みください(https://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Mips/stack.html) - これは関数がローカル変数を格納する方法です、戻り値など –

答えて

6

xは、それぞれです。したがって、fへの2回目の呼び出しには、異なるxがあることを意味します。これを視覚化するために:あなたはそれが好きで見ることができます:

f(x=5) 
    print(x) # this x = 5 
    f(x=4) 
     print(x) # this x = 4 
     f(x=3) 
      print(x) # this x = 3 
      f(x=2) 
       print(x) # this x = 2 
       f(x=1) 
        print(x) # this x = 1 
        f(x=0) 
         print(x) # this x = 0 
         print(x) # this x = 0 
        print(x) # this x = 1 
       print(x) # this x = 2 
      print(x) # this x = 3 
     print(x) # this x = 4 
    print(x) # this x = 5 

は、だからあなたの再帰呼び出しでは、6個の x ESがあります。 x変数の各 等、異なる値を有し、あるレベルより深いそれらを変更して上記レベルに影響を与えないことができる

+0

トップ答えの男:) – WhatsThePoint

4

すべての呼び出しのために、機能は、新しい変数xを作成し、中xのそれぞれの値を出力しますそれは呼ばれた。

関数が呼び出されるたびに、その関数の新しいコピーが作成され、そのスコープ内のxの値も作成されます。つまり、実際には6つのxをそれぞれの値で作成しています。

3

a(5)を呼び出すと、a()x = 5で始まります。これは、3つのことを行います。(値5である)

  1. まずプリントxを
  2. が続い
  3. a(4)は、次にプリント(他のすべての後に)再びxは呼び出し(値5まだあります)。

ステップ2はそれも(2回印刷「4」との間でa(3)を呼び出す)これらの3つの手順を行いますので、少し手の込んだことを起こります。これはa(0)が呼び出されるまで下がりますが、0が2回だけ印刷されますが、a()は再び呼び出されません。

2

私は説明しようとします。if文の中に入るので、a(4)、a(3)、a(2)、a(1)は再帰的に呼び出されるので、a(5)は最下位に、a 、彼らはボトムアップ

def a(x): 
    print(x) # executed  
    if x > 0: 
     a(x - 1) #executed 
    print(x)  

結果に積層されたので、:5,4,3,2,1

(0)が呼び出されると、それは、if文の中に落ちないので、それは0を出力します二度。 a(1)〜a(5)は、まだスタックに残っているため、まだ実行が終了していません。

def a(x): 
    print(x) #executed 
    if x > 0: 
     a(x - 1) 
    print(x) #executed 

結果:0、0

はどのように我々はこれらの関数呼び出しの実行を終了しますか?我々はスタックからそれらをポップする必要があります。私が(5)が底にあり、(1)が上にあると述べたことを思い出してください。スタックがトップダウンされるので、a(0)が返ってくると、a(1)とa(1)が最後のステートメントの実行を終了します。 a(1)がポップされた後、a(2)が呼び出されます。

def a(x): 
    print(x)  
    if x > 0: 
     a(x - 1) 
    print(x) #executed 

結果:1,2,3,4,5

スタックは今や完全にポップされます。

1

これはスタックに関連しています。
すべての呼び出しに対して異なるxが作成されるため、xの値は昇順に印刷されます。

関連する問題