Pythonでフィボナッチ数列のn番目の値、総和を出力するプログラムコードを作ってみた

### 前置き
今日は、フィボナッチ数列のn番目の値を出力できるプログラムコードをPythonで作ってみた。さらに、1番目からn番目までの総和も出力してみた。

### フィボナッチ数列とは
前の2項を足して出来上がる数列のことである。
『1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597....」のように、前の数字を足した数が続く法則のことである。
3項目の2は,1項目の1と2項目の1を足した結果。
4項目の5は,2項目の2と3項目の3を足した結果。
つまり、n項目の数は、n-2項目の数とn-1項目の数の和になる。
漸化式：
![Screenshot 2024-07-02 at 11.41.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2518583/38099324-5e74-42b7-8250-764b73476830.png)
このように、次の項は、前の2項を足し合わせたものになる。
引用元：https://terakoya.ameba.jp/a000001464/

### n番目の値を出力するプログラムコード
``` python
def fibonacci(n):
    if n <= 0:
        return "Invalid input"
    elif n == 1 or n == 2:
        return 1
    else:
        a, b = 1, 1
        for _ in range(3, n+1):
            a, b = b, a + b
        return b

# ユーザー入力を受け取る
n = int(input("フィボナッチ数列の何番目の値を知りたいですか？（1以上の整数を入力してください）："))

if n <= 0:
    print("無効な入力です。1以上の整数を入力してください。")
else:
    fib_value = fibonacci(n)
    print(f"フィボナッチ数列の第{n}番目の値は{fib_value}です。")
```
### プログラムコードの説明
このプログラムでは、ユーザーが１以上の整数を入力する必要があります。そして、ユーザーがフィボナッチ数列の何番目の値を知りたいかを入力できるようにしています。その後、ユーザーが入力したn番目の値が出力されます。しかし、１以下を入力したら、エラーのメッセージが表示されます。

### 出力結果
``` python
フィボナッチ数列の何番目の値を知りたいですか？（1以上の整数を入力してください）：7
フィボナッチ数列の第7番目の値は13です。
フィボナッチ数列の何番目の値を知りたいですか？（1以上の整数を入力してください）：11
フィボナッチ数列の第11番目の値は89です。
フィボナッチ数列の何番目の値を知りたいですか？（1以上の整数を入力してください）：17
フィボナッチ数列の第17番目の値は1597です。
フィボナッチ数列の何番目の値を知りたいですか？（1以上の整数を入力してください）：25
フィボナッチ数列の第25番目の値は75025です。
フィボナッチ数列の何番目の値を知りたいですか？（1以上の整数を入力してください）：30
フィボナッチ数列の第30番目の値は832040です。
```
### 出力結果を検証
![Screenshot 2024-07-02 at 11.41.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2518583/38099324-5e74-42b7-8250-764b73476830.png)
この式に基づいて、結果を検証します。

**7番目の値**：1, 1 , 2 , 3 , 5 , 8 , 13 (**7番目の値は13** )
**11番目の値**：1, 1 , 2 , 3 , 5 , 8 , 13 , 21 , 34 , 55 , 89 (**11番目の値は89**)
**17番目の値**：1, 1 , 2 , 3 , 5 , 8 , 13 , 21 , 34 , 55 , 89, 144 , 233 , 377 , 610, 987, 1597 (**17番目の値は1597**)
**25番目の値**：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 (**25番目の値は75025**)
**30番目の値**：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 (**30番目の値は832040**)

このように、出力結果と計算式を使ってn番目の数を求めた時の値が一致している。

### 数列と総和については、このような規則になっている。
数列 (F)：1, 1, 2, 3, 5, 8, 13, 21, 34
F1 = 1, F2 = 1, F3 = 2, F4 = 3, Fn = Fn-2+Fn-1となっている。
最初の2つの数が1で始まり、それ以降の数は前の2つの数の和で生成される数列です。

総和 (S)：1, 2, 4, 7, 12, 20, 33, 54, 88
Sn ＝ F1 + F2 + ...... + Fnとなっている。
また、フィボナッチ数列の各項の総和は、それまでの数列の全ての項を足したものです。

### n番目の総和までを出力するプログラムコード
``` python
def fibonacci_sum(n):
  if n <= 0:
      return "Invalid input"

  # フィボナッチ数列の初期値設定
  fib_sum = 0
  a, b = 1, 1

  # フィボナッチ数列の各項を計算し、総和を求める
  for i in range(1, n + 1):
      fib_sum += a
      a, b = b, a + b

  return fib_sum

# ユーザー入力を受け取る
n = int(input("フィボナッチ数列の総和を計算する範囲を入力してください（1以上の整数を入力してください）："))

if n <= 0:
  print("無効な入力です。1以上の整数を入力してください。")
else:
  total_sum = fibonacci_sum(n)
  print(f"フィボナッチ数列の最初の{n}項の総和は{total_sum}です。")
```
### プログラムコードの説明
このプログラムでは、ユーザーがフィボナッチ数列の何項目までの総和を計算するか入力します。そして、その範囲までのフィボナッチ数列の各項を計算して、その総和が出力されます。

### 実際の出力結果
``` python
フィボナッチ数列の総和を計算する範囲を入力してください（1以上の整数を入力してください）：5
フィボナッチ数列の最初の5項の総和は12です。
フィボナッチ数列の総和を計算する範囲を入力してください（1以上の整数を入力してください）：7
フィボナッチ数列の最初の7項の総和は33です。
フィボナッチ数列の総和を計算する範囲を入力してください（1以上の整数を入力してください）：10
フィボナッチ数列の最初の10項の総和は143です。
フィボナッチ数列の総和を計算する範囲を入力してください（1以上の整数を入力してください）：15
フィボナッチ数列の最初の15項の総和は1596です。
フィボナッチ数列の総和を計算する範囲を入力してください（1以上の整数を入力してください）：20
フィボナッチ数列の最初の20項の総和は17710です。
```
### 出力結果の検証
**5**項目までの総和:1+1+2+3+5 = **12**
**7**項目までの総和:1+1+2+3+5+8+13 = **33**
**10**項目までの総和:1+1+2+3+5+8+13+21+34+55 = **143**
**15**項目までの総和:1+1+2+3+5+8+13+21+34+55+89+144+233+377+610 = **1596**
**20**項目までの総和:
1+1+2+3+5+8+13+21+34+55+89+144+233+377+610+987+1597+2584+4181+6765= **17710**

皆さんも時間がある時に、このプログラムコードを参考にして、フィボナッチ数列のn番目の値と総和を求めてみてはいかがでしょうか。