Pythonでアルゴリズムの学習中に再帰関数を学んだが、「再帰関数でループしたらその下の行の処理いかないんじゃね?」みたいな感じで処理の順番があやふやなところが多いので、下の例を実装しながら理解を深めていく。
再帰関数とは
定義中の関数の中で、その関数(自分自身)が呼び出される関数のこと。「再帰呼び出し」とも呼ばれる。
繰り返し処理などで使われる。
実装
再帰関数totalでどのような値が出力されるか考える。
def total(data):
if data <= 1:
return data
value = total(data - 1)
return sum(value)
def sum(value):
return value + 3
print(total(3))
まず、引数に3
が入れられたtotal関数が呼び出される。ここで、引数data
が1
以下の場合は「1」が返されるが、現状は3
なので無視。
次に、変数value
が定義されているが、ここで同じ関数が呼び出される(再帰呼び出し)。引数はdata - 1
なので、2
になる。ここではreturn sum(value)
に進まず、total関数が再び上から処理される。引数dataは2
で1以上なのでdataはreturnされず、再び変数value
が定義される(引数は1)。ここでついに引数dataが1
になったので、1
がreturnされ(無限ループすることはない)、引数が2
のtotal関数の変数value
の値は1
になる。そして、return sum(value)
に進むことができる。
sum関数は引数に+ 3
した値を返すだけなので、ここでは1 + 3
で4
が返される。ここで、引数が2
のtotal関数は4
が返されたので、引数が3
のtotal関数の変数value
に4
が与えられる。そして、return sum(value)
に進み、4 + 3
で7
が返され、7
が出力される(引数が3
のtotal関数を出力するのでこれで終わり)。
まとめ
様々なソートのアルゴリズムで難しい再帰関数の使われ方がされており、理解に苦しんでいたが、これを機に少しは楽になった。再帰関数はあまり使うことはないと思うが、頭の片隅にでも入れておくと良いだろうと思った。