C言語ケーススタディ フィボナッチ数列のn番めの値を求める




2014年10月より個人の方を対象に、Study C無料提供を開始しました。
C言語を勉強中の方は、学習・教育に最適なC言語インタープリタのStudy Cを使ってみてください(個人の方は無料です)。
大学・高専・高校などの教育機関での採用実績も多数あるロングセラー商品Study Cが、個人向けに無料提供を始めました。
インタープリタの手軽さに加え、ゲームや3Dタートルグラフィックで楽しく勉強したりと、C言語の学習を強力にサポートします。
ブロック崩しゲーム 3Dツリー クリスマスツリー
また、このようなボタンの用意されているページでは、掲載しているプログラムをStudy Cに直接ロードし実行したりすることができます。
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する
Study C無料利用についての詳細は、このページを参照してください。



今回は授業の課題らしき、次の問題を解いてみることにします。
フィボナッチ数列のn番めの値を表示せよ。
        F0 = 0            Fn = Fn-1 + Fn-2
        F1 = 1
F0  F1  F2  F3  F4  F5  F6  F7  F8  F9  F10  ...
 0   1   1   2   3   5   8  13  21  34   55  ...
結局、数列の前2個の値を加えたものが数列の値となります。
このプログラムのポイントは次のようになります。
・このような繰り返しの問題にはループを使います。
・ループ内で順次Fnの値を算出していきます。
・前2個の値を覚えておく必要があるためfn_m1とfn_m2という変数を用意しておきます。
・Fnを算出したらfn_m1とfn_m2に1個前の値と2個前の格納していきます。
int     fn(int num);

main(int argc, char *argv[])
{
        if(argc != 2){
                printf("コマンドの入力形式が間違っています.\n");
                return;
        }
        printf("%d\n", fn(atoi(argv[1])));
}


fn(int num)
{
        int     i1, fn_n, fn_m1, fn_m2;

        if(num == 0)
                return(0);
        if(num == 1)
                return(1);

        fn_n = 0;
        fn_m1 = 0;
        fn_m2 = 1;
        for(i1 = 0; i1 < num; i1++){
                fn_n = fn_m1 + fn_m2;
                fn_m2 = fn_m1;
                fn_m1 = fn_n;
        }
        return(fn_n);
}
Study Cにロードする Study Cにロードし編集する ブラウザとの連携機能が使用可能なStudy Cのバージョンなどについて... 「run 6」のように実行する必要があるので実行ボタンはありません
実行時に何番目の値を算出するかを指定します。
例)
run 7
13