アメリカの大学で奮闘中

アメリカの大学でプログラミングを学ぶべくコンピューターサイエンス学部に留学したものの挫折し数学科に転部した著者が、自分の挫折ポイントを踏まえて数学、プログラミング、アルゴリズムついてできる限り分かりやすく解説してみるブログ。*できる限り記事の内容は技術的な間違いをしないように気をつけていますが、もし間違いがあれば教えていただけると助かります。

<Recursion 再帰>コードをできるだけ短く書く技 by python

*この記事は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))

f:id:Astrostory:20200210154933p:plain

 

下の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) の値が出ます。

 

 

 

以上が再帰の説明です。

少しでも参考になれば幸いです。

 

そしてもし何か(技術的な)間違いを見つけられた方がいらっしゃればコメント欄に書いていただけると幸いです。