まず kansuu(0) で、関数を呼び出します。
呼び出された関数は、自身をコピーして、コピーを渡します。
def kansuu(x):
if x == 2:
return
print(x)
return kansuu(x + 1)
kansuu(0)
def kansuu(x): # 新しいコピー
if x == 2:
return
print(x)
return kansuu(x + 1)
↓ 最初に、引数 0 を受け取る
def kansuu(0): # 実行中
if x == 2:
return
print(x)
return kansuu(x + 1)
↓ 0 == 2 ではないので 0 を出力
def kansuu(0): # 実行中
if False:
return
print(0)
return kansuu(x + 1)
0
↓ kansuu(0 + 1) → kansuu(1) となる
def kansuu(0): # 実行中
if False:
return
print(0)
return kansuu(1)
return する前に、引数 1 の為の kansuu(x) が呼び出される
kansuu(x) は、kansuu(1) 用にテンプレート(自身)をコピーして、そのコピーを渡す。
↓
def kansuu(0): # 待機中
if False:
return
print(0)
return kansuu(1)
def kansuu(x): # 新しいコピー
if x == 2:
return
print(x)
return kansuu(x + 1)
↓ 引数 1 を受け取る
def kansuu(0): # 待機中
if False:
return
print(0)
return kansuu(1)
def kansuu(1): # 実行中
if x == 2:
return
print(x)
return kansuu(x + 1)
↓ 1 == 2 ではないので 1 を出力
def kansuu(0): # 待機中
if False:
return
print(0)
return kansuu(1)
def kansuu(1): # 実行中
if False:
return
print(1)
return kansuu(x + 1)
1
↓ kansuu(1 + 1) → kansuu(2) となる
def kansuu(0): # 待機中
if False:
return
print(0)
return kansuu(1)
def kansuu(1): # 実行中
if False:
return
print(1)
return kansuu(2)
return する前に、引数 2 の為の kansuu(x) が呼び出される
kansuu(x) は、kansuu(2) 用にテンプレートをコピーして、そのコピーを渡す。
↓
def kansuu(0): # 待機中
if False:
return
print(0)
return kansuu(1)
def kansuu(1): # 待機中
if False:
return
print(1)
return kansuu(2)
def kansuu(x): # 新しいコピー
if x == 2:
return
print(x)
return kansuu(x + 1)
↓ 引数 2 を受け取る
def kansuu(0): # 待機中
if False:
return
print(0)
return kansuu(1)
def kansuu(1): # 待機中
if False:
return
print(1)
return kansuu(2)
def kansuu(2): # 実行中
if x == 2:
return
print(x)
return kansuu(x + 1)
↓ 2 == 2 で True になり、処理中のこの関数の終了条件となる
def kansuu(0): # 待機中
if False:
return
print(0)
return kansuu(1)
def kansuu(1): # 待機中
if False:
return
print(1)
return kansuu(2)
def kansuu(2): # 実行中
if True: # ← 再帰関数の終了条件になる
return
print(x)
return kansuu(x + 1)
↓ 戻り値 None で 呼び出し元に return する
def kansuu(0): # 待機中
if False:
return
print(0)
return kansuu(1)
def kansuu(1): # 実行中
if False:
return
print(1)
return None # ← ココに戻る
----- def kansuu(2): は破棄された -----
↓ 戻り値 None で呼び出し元に return する
def kansuu(0): # 実行中
if False:
return
print(0)
return None # ← ココに戻る
----- def kansuu(1): は破棄された -----
↓ 戻り値 None で呼び出し元に return する
def kansuu(x):
if x == 2:
return
print(x)
return kansuu(x + 1)
kansuu(0) # ← ココに戻る
def kansuu(0): # 実行中
if False:
return
print(0)
return None
↓
def kansuu(x):
if x == 2:
return
print(x)
return kansuu(x + 1)
None # ← 戻り値 None に化ける
----- def kansuu(0): は破棄された -----
これでこの再帰関数プログラムは正常に終了しました。