STEP 4.1b 再帰


<問題>

入力された正の整数の階乗を求める再帰プログラムを作成せよ。
(0の階乗と1の階乗は1だけれども、0の階乗は今回、扱わないことにします。


<実行結果>

入力してください: 6
6の階乗:720

入力してください: 4
4の階乗:24

<ヒント>  再帰の話題には、(1)再帰的な(関数定義と)プログラム (2)実行の様子、結果
      
      再帰プログラムは、停止条件と再帰条件で、とらえる!
        Nの階乗の再帰プログラムは、
          停止条件 1の階乗は1  (ズバっと答えが決まる場合)
          再帰条件 (Nが1では、ないのなら)Nの階乗はN-1の階乗の値*N (N−1の場合の答えがわかるならNの答えは)
      
      実行結果
      rfactorial(5) = 5 * rfactorial(4) (再帰条件)
              rfactorial (4) = 4 * rfactorial (3)
                   
                  rfactorial(1) = 1  (停止条件)
              120
            720


例題集へ



解答例

#include <stdio.h>

int rfactorial (int);

int rfactorial (int n) {

    if (n == 1) /* 停止条件かどうかをチェック */
         return 1;  
                /* きちんと、読み込もう。もやっと、させないほうがよい。
                   条件n の値が1     戻り値は1 */
    else  /* 再帰条件 */
         return n*rfactorial(n-1);
                /* この省略プログラム、土屋は嫌い。しっかり書いたほうがよい。
                   条件nの値が1より大  if (n > 1) return n*rfactrial(n-1)
                   n-1のfactrorialを計算
          戻り値は、その答えにnを掛けたもの */
}

int main (void) {
    int i;

    printf("入力してください: ");
    scanf("%d", &i);

    printf("%dの階乗:%d\n",i, rfactorial(i));

    return 0;
}