STEP 4.1b 再帰で階乗 (2013年度 坂倉さんの作品)


<問題>

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


<実行結果>

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

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

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

#include <stdio.h> int rfactorial (int n); int rfactorial (int n) { } int main () { int i; printf("入力してください: "); scanf("%d", &i); printf("%dの階乗:%d¥n",i, rfactorial(i)); return 0; }

#include <stdio.h> int rfactorial (int n); int rfactorial (int n) { if (n == 1) /* 停止条件かどうかをチェック */ return else /* 再帰条件 */ return } int main () { int i; printf("入力してください: "); scanf("%d", &i); printf("%dの階乗:%d¥n",i, rfactorial(i)); return 0; }

#include <stdio.h> int rfactorial (int n); int rfactorial (int n) { if (n == 1) /* 停止条件かどうかをチェック */ return 1; else /* 再帰条件 */ return } int main () { int i; printf("入力してください: "); scanf("%d", &i); printf("%dの階乗:%d¥n",i, rfactorial(i)); return 0; }

#include <stdio.h> int rfactorial (int n); int rfactorial (int n) { if (n == 1) /* 停止条件かどうかをチェック */ return else /* 再帰条件 */ return } int main () { int i; printf("入力してください: "); scanf("%d", &i); printf("%dの階乗:%d¥n",i, rfactorial(i)); return 0; }

#include <stdio.h> int rfactorial (int n); int rfactorial (int n) { if (n == 1) /* 停止条件かどうかをチェック */ return 1; else /* 再帰条件 */ return } int main () { int i; printf("入力してください: "); scanf("%d", &i); printf("%dの階乗:%d¥n",i, rfactorial(i)); return 0; }

解答例
#include <stdio.h>
 
int rfactorial (int n) { 
 
   if (n == 1) /* 停止条件かどうかをチェック */
         return 1;  
   else  /* 再帰条件 */
         return n*rfactorial(n-1); 
}
 
int main () {
   int i;
 
   printf("入力してください: ");
   scanf("%d", &i);
 
   printf("%dの階乗:%d¥n",i, rfactorial(i));
 
   return 0;
}