Pythonで再帰関数!
再帰関数ってなんだかわかりにくい。わかったつもりでも、やっぱり?がつくことが多い。
解説されているので自分でも実行してみる。
まずよくみるやつ"階乗"。
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n-1)
与えられた数を全て掛け合わせる。立とえば"3"を引数に入れると
と出る。
3を入れた場合はnは0ではないので
3 * factorial(2)
となります。
factorial(2)と言うのは同じくnは0でないので
2 * factorial(1)
factorial(1)と言うのは
1 * factorial(0)
1 * factorial(0)となります。nが0となるのでこの結果は
となります。と言うことは遡って、2 * factorial(1)は
3 * factorial(2)は
となります。結果的に
となります。でもなんだかややこしいですね。
もっと簡単に
def countdown(n):
if n <= 0:
print("Liftoff!")
else:
print(n)
countdown(n-1)
とすると3を入れると
3,2,1,Liftoff!
と出力されます。
仕組みは"3"を入れた場合はまず0以上なので
else:
print(n)
countdown(n-1)
を実行することになり
print(n)
でそのまま"3"が出力されます。
そして
countdown(n-1)
再帰となるのでこの繰り返しが続いて
"0"になったら
if n <= 0:
print("Liftoff!")
が実行され
"Liftoff!"
が出力されます。
この再帰関数は単純なんで
が繰り返されていることがわかりやすいと思います。
最初に紹介しているfactorialの場合はfactorial()の関数
は関数の計算にnを掛けて計算を求めないといけないので実質、
のところで数字が"1"のところでfactorial(n-1)の答えが出る。その数字を使って遡って計算、この場合"n"に掛けていくイメージです。
シンプルにはなりますがある程度理解しないと難しいく感じます。
代表的な関数です。
フィボナッチ数列
def fibonacci(n):
if n <= 1:
return n
else:
return fibonacci(n-1) + fibonacci(n-2)
以下サイトで理解が進むと思います。