「1~n」までの和を求める再起関数

0~10の合計= 55
5の階乗= 120

C# の再起関数(recursive function)で「1~n」までの和を求めます。
再起関数から戻るときに処理する基本的な方法です。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. 「1~n」までの和を求める再起的な考え方は次のとおりです。
    1. sum(n) を 1~n までの和を求める関数とする。
    2. n がゼロのときは、解はゼロである。
    3. n が1以上のときは、sum(n-1) に n を加えた値が解である。
    この考え方をそのままプログラムすると再起関数が完成します。
  2. sum 関数の中から sum 関数を CALL していることに注目して下さい。
    このように自分自身を呼び出す関数を「再起関数(recursive function)」と言います。 (^_^;)
    関数(method) の基礎は メソッド(method) の定義 を参照して下さい。
  3. ソースコードです。
    /*********************************************/
    /*★ C# Fuct Function Program    前田 稔 ★*/
    /*********************************************/
    using System;
    
    class console
    {
        public static int Main()
        {
            Console.WriteLine("1~10の合計= {0}",sum(10));
            //Console.WriteLine("5の階乗= {0}",fuct(5));
            System.Console.ReadLine();
            return 0;
        }
        //「1~n」の合計
        static int sum(int n)
        {
            if (n==0)   return 0;
            return sum(n-1)+n;
        }
    }
    

【演習】

  1. sum 関数からリターンされる値をトレースして、再起関数の実行の流れを理解して下さい。
  2. パラメータの値を変えて試して下さい。
  3. 階乗(factorial) も同じような考え方でプログラムできます。
    再起的に階乗を求める関数 fuct(n) を作成して下さい。
  4. 階乗を求める再起的な考え方は次のとおりです。
    1. fuct(n) を 1~n までの階乗を求める関数とする。
    2. n がゼロまたは 1 のときは、解は 1 である。
    3. n が1以上のときは、fuct(n-1) に n を乗じた値が解である。
  5. 階乗に付いての補足です。
    0 の階乗は 1 です。
    1 の階乗は 1 です。
    2 の階乗は 1*2=2 です。
    3 の階乗は 1*2*3=6 です。
    4 の階乗は 1*2*3*4=24 です。

【NOTE】

  1. 再起の考え方はとっつき難く、慣れるまで大変でしょうがその威力は抜群でぜひ身に付けたいものです。
    私の経験では「ループは全て再起」になり、完成したプログラムは非常にスマートです。 (^_^;
  2. 再起にとりつかれると何でも再起で処理したくなりますが多用は禁物です。
    作成した本人はともかく、論理の流れが他人には非常にわかり難いのです。
    再起処理は、しっかりした構想の下「処理できる確信」を持ってプログラムして、思い通りの結果が出て始めて その考え方が正しいことが証明されるのです。
    正しく動かない再起プログラムほど始末に悪いものはありません。
    再起処理のプログラムは、自分の責任で完成させる力を身につけてから挑戦して下さい。
  3. 再起プログラムの構成。
    1. 再起もループと同じように初期値の設定が必要です。
      普通は関数を最初にコールするときに初期値を設定します。
    2. 一般的に再起関数の先頭で、終了条件を判定して関数からリターンします。
    3. 「何か処理をして」関数を再起コールします。
      このとき次の条件を満たすことが必要です。
      • 関数を繰り返し呼び出すことにより「処理が進展する」こと。
      • 関数を繰り返し呼び出すことにより「やがて終了条件に達する」こと。
    4. 再起関数には「コールする前」と「ワンレベル再起関数から戻ったとき」の二箇所で処理を行うことが出来ます。
      「コールする前」に処理する代表的なプログラムは最大公約数を求めるプログラムです。
      「ワンレベル再起関数から戻ったとき」に処理する代表的なプログラムは階乗を求めるプログラムです。
      もちろん「コールする前」と「ワンレベル再起関数から戻ったとき」の両方で処理することも出来ます。
  4. 再起関数の代表は「リスト処理」で、その中でも LISP 言語は芸術的と思われるほどスマートです。
    機会があればぜひ挑戦してみて下さい。

超初心者のプログラム入門(C# Frame Work)