初心者がまとめるPython Programmingと時々数学

University of California Berkeleyに在籍中。自分用に勉強内容をまとめるブログ。

続:再帰関数 Tree Recursion

前回は再帰関数の基本についてやりました。3つの要素

 

1. Base case...終了条件

2. Recursive call...再帰表現

3. Solve full problem...2を使って元々の問題を解く

 

今回もそれに則ってやっていく。

 

まず、Tree Recursionというのは、基本的に樹形図みたいなもの。

樹形図を書いて、base caseを探して、残りを再帰にしよう的な。その際に、再帰表現が2つ以上になる事が多い(パターンが枝分かれしているから)。

 

この概念を使うと、フィボナッチ数列を求めるプログラムが簡単に書けるようになる。

まず、フィボナッチ数列というのは、0th=0、1st=1として、前の数字と現在の数字を足したものが次の数字になるという数列。つまり、

0、1、1、2、3、5、8、13、21、34、55、89、…

という風に増加していく。このn番目の数字が何かを求めるプログラムを書く。

例えば、4番目のフィボナッチ数列を求めたい。この時の樹形図を書くと、

f:id:xUshi:20180916203009p:plain

という風になる。フィボナッチ数列の1番目は1、0番目は0なので、この末端の数字を足していくと3となり、フィボナッチ数列4番目の数は3である事がわかる。

この末端のfib(1)とfib(0)をbase caseとして再帰関数でフィボナッチ数列を表す事が出来る(n == 1 の時、 return 1n == 0 の時、return 0)。

そして出来上がるプログラムがこちら。

f:id:xUshi:20180916203554p:plain

この場合のbase caseはn=0とn=1の2通り。最後のelse文で再帰表現を二つ使っているのはそのため。

 

つまり、Tree Recursionの場合も、基本的には終了条件は何か、returnで自身を返しているか、またその表現は終了条件に収束していくかどうかを考えれば良い。

 

練習問題1

n段の階段がある。この階段を登るとき、1段か2段ずつしか上がらないことにする。この時、何通りの登り方があるかを計算するプログラムを作りなさい。

def   count_stair_ways(n):

        """

        >>> count_stair_ways(7)

        21

        >>> count_stair_ways(3)

        3          # 1+1+1, 1+2, 2+1

        """

解答

f:id:xUshi:20180916204552p:plain

 

練習問題2

先の問題で1段か2段を上がる代わりに、k以内の段数を登ることにする。この時の登り方が何通りあるかを計算するプログラムを作りなさい。

def   count_k(n, k):

        """

        >>> count_k(3, 3).         # 3, 2+1, 1+2, 1+1+1

        4

        >>> count_k(4, 4)

        8

        """

解答

f:id:xUshi:20180916205002p:plain

一応これも再帰関数…

 

練習問題3

パスカルの三角形の(row, column)の位置の数字を求めるプログラムを作りなさい。

f:id:xUshi:20180916205621p:plain

def   pascal(row, column):

        """

        >>> pascal(2, 1)

        2

        >>> pascal(4, 2)

        6

        """

解答

f:id:xUshi:20180916205808p:plain