夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

フィボナッチ数列

本日は諸事情あって開発が進まなかったためプログラミング基礎枠です。

ChatGPTにお題を出させて筆者が回答、ChatGPTに添削してもらいます。

〇お題

本日のお題はフィボナッチ数列です。

プログラミングでn項を求めていきます。

問題: フィボナッチ数列

フィボナッチ数列は、最初の2つの数が1で、それ以降の各数が前の2つの数の合計である数列です。つまり、1, 1, 2, 3, 5, 8, 13, 21, 34, ... と続きます。この数列の第n番目の数を計算するプログラムを作成してください。

プログラムは以下の要件を満たす必要があります:

ユーザーから整数nを入力として受け取ります。 第n番目のフィボナッチ数を計算し、それを表示します。 再帰を使用してフィボナッチ数列を計算するプログラムを作成することもできますが、非再帰的な方法を使用してもかまいません。 この問題を解決するプログラムを作成し、異なるnに対してテストしてみてください。また、計算結果が大きくなる場合にも対応できるように考慮することがおすすめです。

〇筆者の回答

using System;
using System.Collections.Generic;
                    
public class Program
{
    //フィボナッチ数列= 1,1,2,3,5,8,13,21,34,55,...
    public static void Main()
    {
        int input = 5;//求めたいフィボナッチ数列のn項
        if(input <0)
        {
            Console.WriteLine("フィボナッチ数列の"+input+"項は存在しません");
        }
        Console.WriteLine("フィボナッチ数列の"+input+"項は"+FibonacciSequ(input)+"です");
    }
    public static int FibonacciSequ(int input)
    {
        
        int result = 0;//フィボナッチ数列第0項
          List<int> fib = new List<int>(){0,1}; //フィボナッチ数列
        for(int i=2; i<= input ; i++)//2以上の項の処理 
        {
            result = fib[i-2]+fib[i-1];//前の2つの項の和
            fib.Add(result);
        }
        return fib[input];
    }
}

〇ChatGPTの添削

提供されたコードは、与えられた整数nに対して、非常に効率的で正確な方法でフィボナッチ数列の第n項を計算するための素晴らしい解決策です。以下はコードの評価と改善点です:

評価:

フィボナッチ数列の計算: コードは、非常に効率的にフィボナッチ数列のn項を計算します。再帰を使用せず、リストを介して前の項目を再利用する方法を採用しています。

エラーハンドリング: 入力が負の数の場合にエラーメッセージを表示するなど、エラーハンドリングが行われています。

コメントと可読性: コードにコメントが付けられており、理解しやすい構造を持っています。

改善点:

メモリ効率: フィボナッチ数列のn項を計算する際に、リストを介して前の項目を保持しています。このアプローチは正確で効率的ですが、nが非常に大きい場合、メモリ消費が増加する可能性があります。この問題を回避するために、リストを使用せずに直接計算する方法を検討することもできます。

整数オーバーフロー: int の範囲を超える大きなnに対しては、正確な計算ができません。この場合、大きな整数型 (BigInteger など) を使用する必要があります。

提供されたコードは、効率的で正確な解法であり、90点から100点の評価を受けるでしょう。改善点に対処することで、さらに高い点数を獲得できるでしょう。

ChatGPTの添削結果

using System;
using System.Numerics;

public class Program
{
    public static void Main()
    {
        int input = 5;
        if (input < 0)
        {
            Console.WriteLine("フィボナッチ数列の" + input + "項は存在しません");
        }
        Console.WriteLine("フィボナッチ数列の" + input + "項は" + Fibonacci(input) + "です");
    }

    public static BigInteger Fibonacci(int n)
    {
        if (n == 0)
        {
            return 0;
        }
        if (n == 1 || n == 2)
        {
            return 1;
        }

        BigInteger a = 1;
        BigInteger b = 1;
        BigInteger result = 0;

        for (int i = 3; i <= n; i++)
        {
            result = a + b;
            a = b;
            b = result;
        }

        return result;
    }
}

nが非常に大きい場合、メモリ消費が増加する可能性があります。この問題を回避するために、リストを使用せずに直接計算する方法を検討することもできます

に関して筆者の回答の場合Listを作成し、一つ一つ計算結果を格納していました。

メモリ消費が増加するとはまさにこのことで、nの値が大きい場合リストに格納されるデータ量も増えます。

ChatGPTによる添削では0,1の場合を除き、3項目からListに格納せずに処理を実行しています。

この際にa,bのBigInteger型を定義しています。 BigIntegerは上限下限のない整数を扱うことができ、intに比べこの計算の場合は適していると呼べます。

こちらでも計算量に応じて値の大きさによってメモリの使用量が発生しますが、2つの変数のためさほど問題にならないと呼べます。

以上が本日のお題でした。