schedule2018-12-21

【Python】n番目のフィボナッチ数を求める

指定の番号のフィボナッチ数の出力とn番目までのフィボナッチ数列を求める関数を作成しました。

フィボナッチ数列 (Fibonacci number)

フィボナッチ数列は2つの1から始まります。 その後には直前の2つの数の和を書くことを続けます。

1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, ...

こうやって続いた数列をフィボナッチ数列と呼びます。

また、フィボナッチ数列は黄金比との関係もあります。 黄金比は、1:1.61803..です。

隣の数値を割っていくと。。。

1 / 1 = 1
2 / 1 = 2
3 / 2 = 1.5
5 / 3 ≒ 1.666666
8 / 5 = 1.6
13 / 8 = 1.625
21 / 13 = 1.61538

段々と黄金比に近づいてきました。

フィボナッチ数列を出力する関数

変数を少なくしました。

"""
フィボナッチ数列
"""
def fb(num):
    a, b = 1, 0
    for _ in range(num):
        print(a)
        a, b = a + b, a

if __name__ == "__main__":
    fb(20)

"""出力
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
"""

ポイントはa, b = a + b, aのところです。

直前の数値も保持する必要があるため、次のaにはa + bを、次のbにはaを代入します。

c = a # aは一時変数に渡す必要がある。
a = a + b
b = c

しかし、ひとつずつ代入すると上のように2文字では足りません。

Pythonでは一時変数を使わずに、a, b = a + b, aといった書き方が可能です。

num番目のフィボナッチ数を返す場合

def fb(num):
    """num番目のフィボナッチ数を返す
    """
    a, b = 1, 0
    for _ in range(num):
        a, b = a + b, a
    return b

if __name__ == "__main__":
    print(fb(10))
    print(fb(100))
    print(fb(1000))

"""出力
55
354224848179261915075
43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875
"""

Pythonを初めて学ぶ方へオススメの本です!
Mac、Windows環境の整え方から手を動かして実行できるようになっていきます。

合わせてオンライン学習も進めるとより理解が深まると思います。

オンライン教育のUdemy

Python3の入門オンライン講座