疑念は探究の動機であり、探究の唯一の目的は信念の確定である。

数学・論理学・哲学・語学のことを書きたいと思います。どんなことでも何かコメントいただけるとうれしいです。特に、勉学のことで間違いなどあったらご指摘いただけると幸いです。 よろしくお願いします。くりぃむのラジオを聴くこととパワポケ2と日向坂46が人生の唯一の楽しみです。

第3回: フィボナッチ数列や階乗などの再帰的な関数をPythonで作る

概要
{a_{n} = 2 a_{n-1} + 1, \,\, a_1 = 1} のような漸化式をPythonで定義する方法を示す。そのような再帰的な関数の例として、フィボナッチ数列 {\texttt{Fib}} と階乗 {\texttt{Fac}} のプログラムを書く。

漸化式のプログラム

初期が {a_1 = 1} である {a_{n} = 2 a_{n-1} + 1} のような漸化式を考えます。これは値が10のとき {\texttt{a(10) = 1023}} と出力される漸化式です。このプログラムは以下のようにすればできます。

def a(n):
    if n==1:
        return 1
    else:
        return 2 * a(n-1) + 1

この関数に {\texttt{n = 10}} と代入すれば、

>>> a(10)
1023

となります。
このような関数には再帰的に定義されています。つまり、{\texttt{a(n)}} の定義に {\texttt{a(n-1)}} が使われていることです。
例えば、{\texttt{a(3) = 7}} は次のように計算されます。

(1) {\texttt{n = 3}} {\neq} {\texttt{1}} より、{\texttt{a(3) = 2 * a(3 - 1) + 1 = 2 * a(2) + 1}} となる。
(2) {\texttt{n = 2}} {\neq} {\texttt{1}} より、{\texttt{2 * a(2-1) + 1 = 2 * a(1) + 1}} となる。よって、{\texttt{a(3) = 2 * (2 * a(1) + 1) + 1}} である。
(3) {\texttt{n = 1}} より、{\texttt{a(1) = 1}} である。
よって、{\texttt{a(3) = 2 * (2 * 1 + 1) + 1}} である。これを計算すると {\texttt{a(3) = 7}} である。

次に再帰的な関数の例であるフィボナッチ数列のプログラムを書きます。

フィボナッチ数列のプログラム

フィボナッチ数列は次のような数列です。
{\texttt{Fib(n) = Fib(n-1) + Fib(n-2)}\,\,\,\,(\texttt{n} \geq \texttt{2})}
{\texttt{Fib(0) = 1,}\,\,\,\, \texttt{Fib(1) = 1}}

フィボナッチ数列は次のようなプログラムです。

def Fib(n):
    if n == 0:
        return 1
    elif n == 1:
        return 1
    else:
        return Fib(n-1) + Fib(n-2)

これは前のプログラムとほとんど変わりませんが、{\texttt{elif}} が使われています。
つまり、{\texttt{n = 0}} が偽であり(i.e., {\texttt{n}\neq \texttt{0}}) 、かつ {\texttt{n = 1}} が真である(i.e., {\texttt{n = 1}}) であるとき、{\texttt{1}} を出力します。それ以外のとき (i.e., {\texttt{n} \geq \texttt{2}})は {\texttt{Fib(n-1) + Fib(n-2)}} を出力します。
これによって、例えば、

>>> Fib(2)
2
>>> Fib(10)
89

最後に階乗 {!} のプログラムを書いて終わりたいと思います。

階乗のプログラム

一見すると階乗は再帰的な関数とは思われないかもしれません。例えば、3の階乗は {3! = 3\cdot 2\cdot 1 = 6} です。しかし、階乗も上のプログラムと同様に再帰的に定義されます。

def Factorial(n):
    if n == 1:
        return 1
    else:
        return n * Factorial(n-1)

このように定義することによって、

>>> Factorial(3)
6
>>> Factorial(5)
120

と表示されます。プログラムの仕組みは前のと同じです。
{\texttt{Factorial(3) = 3 * Factorial(2) }}
{\texttt{= 3 * 2 * Factorial(1) = 3 * 2 * 1 = 6.}}

だいたいこんな感じです。参考になってくれたら嬉しいです。



僕から以上