ほとんどがウェルレルです。あなたが上に乗っている部分は、あなたが「始めよう」と言うときです。関数が開始していない - それは自身を呼び出しています。これは、純粋な関数で見やすくなります - 追加を見てください。
def add(x, y):
if y == 0:
return x
return 1 + add(x, y-1)
これは(これはひどいアイデアですが、例示的な目的のために...)さんは、いくつかの呼び出しを介してこれを追跡でき、それらをカウントすることにより、基本的に2つの番号を追加します。あなたの関数は、わずか開始した場合等において考えられるように答えは、100
ではありませんが
>>> add(100, 4) = 1 + add(100, 3)
# because we're returning 1 + add(x, y-1)
... add(100, 3) = 1 + add(100, 2)
... add(100, 2) = 1 + add(100, 1)
... add(100, 1) = 1 + add(100, 0)
... add(100, 0) = 100 # this is called the base case.
。バック機能の本来の実行に差し込むその値にadd
解決への呼び出しのそれぞれ、あなたが持っているので:方法のうちの例では
>>> add(100, 4) = 1 + (1 + add(100, 2)) # subbing out...add(100, 3)
= 1 + (1 + (1 + add(100, 1))) # ... add(100, 2)
= 1 + (1 + (1 + (1 + add(100, 0)))) # ... add(100, 1)
= 1 + (1 + (1 + (1 + 100))) # ... add(100, 0)
= 1 + 1 + 1 + 1 + 100 # because addition is associative
= 104
を、私たちはどのようにそれを見ることができますあなたの機能に適用されます。条件式のreturn
は完全に機能しますが、最も内側の関数からのみ起動します。
# where a = "This should print n times"
# and b = "This should not print"
>>> test(2) = print(a); test(1); print(b)
... test(1) = print(a); test(0); print(b)
... test(0) = None # because of the early-exit
ポップのすべてのそれらのもの、あなたが持っている:2 print(a)
sおよび2 print(b)
秒を持っている
>>> test(2) = print(a); (print(a); None; print(b)); print(b)
# test(1) ---^
# test(0)---------------^
。
初めてはい、が、その後、あなたは、再帰呼び出しから戻ると呼び出された関数が終了するまで再帰が唯一の更なる実行を中断しているので、あなたは最後の 'print' –
に達します。 "This should should be print"をしたくない場合は、 'return test(n-1)'にしてください。 – MSeifert
http://pythontutor.com/ – jonrsharpe