まず 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):
は破棄された -----
これでこの再帰関数プログラムは正常に終了しました。