*この記事はforループと関数の知識がある人に向けて書いています
簡単な問題を出させてください。
「n!(nは任意の自然数) の計算結果を返す関数(factorial)をかいてください」
一番最初に思いつく方法はこれだと思います。
def factorial(n):
num = 1
for i in range(n):
if i+1 > n: break
num *= i+1
return num
ですが、実はもっと簡単に書く方法があります。
def factorial2(n):
if n == 0: return 1
return n * fractional2(n - 1)
最後の行を見て関数のなかで関数を呼び出してることに「そんなのありかよー!?」ってなった人も実行結果をみてください
print(factorial(5))
print(factorial2(5))
120
120
>>>
ちゃんと同じように 5!= 120を表示しています。
さて、下の関数(factorial2)を詳しく見ていきましょう。
まず、関数の中で関数を呼び出すことはありです。そしてこのアルゴリズムをRecurtion (再帰)
と言います。
関数が関数自体を呼び出すとどうなるのでしょうか?
下の図にまとめて見ました
def factorial2(n):
if n == 0: return 1
return n * fractional2(n - 1)
print(factorial2(5))
下のprint statementからn=5から始まることがわかります。
n = 5の時のreturnは 5*factorial2(5-1) です。
なので次は n=4になって関数が呼び出されます。
n=4の時のreturnは 4*fractorial2(4-1) です。
このようにnが少しずつ下がって最後はn=0に到達します。
returnは1です。(2行目のif文より)
このif文のことを ベースケース と言って、ここで再帰が終わります。
逆にこれがないと永遠に終わることのない関数ができてしまいます。
きになる方は上のコードのif文を消去して、自分で実行して見てください
さて、factorial(0)の値が出るとそれが芋ずる式に代入されて、
最後に欲しかったfactorial(5) の値が出ます。
以上が再帰の説明です。
少しでも参考になれば幸いです。
そしてもし何か(技術的な)間違いを見つけられた方がいらっしゃればコメント欄に書いていただけると幸いです。