問題
- 長さMの配列の要素の値の合計(和)を求める。再帰関数を用いる。
- 配列(M=10)は、array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; とする。
- 関数を使わないループバージョンは例題集の0401
array:1 2 3 4 5 6 7 8 9 10 sum = 55
- printf("total = %d\n", 関数の呼び出し)
- 配列は大域変数(グローバル変数)としよう。
- 再帰的プログラムは停止条件と再帰条件。言葉で語ろう。
- ずばり、答えが決まる場合は、どんな場合
- N - 1の場合の解がわかっているとすると、Nの場合の解は...
例題集ページ
- 0401 (配列要素にループ処理)(要素の合計)
- 0901 (再帰の基本)(階乗)
- 0802 (配列を関数の引数にするなら) (要素の合計、関数)
- 配列を大域変数でアクセスするのではなく、関数の引数にする場合の例題
#include <stdio.h> #define M 10 int array[M] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; int add(int len); /* 関数テンプレート。型以外も宣言しておく例 引数はint 名前はlen */ int main(void) { int i; printf("array:"); for (i = 0; i < M; i++) { printf("%d ", array[i]); } printf("\n"); printf("\n"); printf("sum = %d\n", add(M)); /* 関数 addの戻り値をプリント */ return (0); } /* 自分より前を合計。長さがだんだん小さくなる */ /* printfで実行過程を表示しています */ int add(int len) { if (len == 1) { /* 1つしかないなら、前がないので先頭。array[0] */ printf("add(%d) = array[%d] = %d\n", len, len - 1, array[0]); return array[0]; } else { /* 前を合計した値に自分を加算 */ printf("add(%d) = add(%d) + array[%d] = add(%d) + %d\n", len, len - 1, len - 1, len - 1, array[len-1] ); return (add(len - 1) + array[len - 1] ); } }