★関数(再帰呼び出し3)★


では、再帰呼び出し定番のプログラムを紹介します。

大体どのプログラミングサイトを見ても、再帰の紹介はこんな感じで行われています。

1つめは「数列の和」です。

1から10までの和を求めるプログラムを作ってみます。

正直、再帰呼び出しを使わなくても↓のプログラムで出来ますよね。

<sample program 149-01>

#include <stdio.h>

int main(void)
{
    int i;

    int answer;

    answer = 0;

    for (i = 1; i <= 10; i++) {
        answer += i;
    }

    printf("answer = %d\n", answer);

    return 0;
}

<実行結果>

answer = 55
続行するには何かキーを押してください・・・

しかし、再帰呼び出しを説明するための章ですから、これを無理やり再帰呼び出しを使ったプログラムにしてみます。

<sample program 149-02>

#include <stdio.h>

int Sum(const int value);

int main(void)
{
    int answer;

    answer = Sum(10);

    printf("answer = %d\n", answer);

    return 0;
}

int Sum(const int value)
{
    if (value > 0) {
        return value + Sum(value - 1);
    }
    else {
        return 0;
    }
}

<実行結果>

answer = 55
続行するには何かキーを押してください・・・

結果はきちんと出ていますが、慣れていないとどんな風に動いているのか分かりません。

計算の途中で自分自身を呼び出していますので、より複雑になった気がします。

1から10までの和だと、説明が長くなりますので1から3までの和にして説明します。

<sample program 149-03>

#include <stdio.h>

int Sum(const int value);

int main(void)
{
    int answer;

    answer = Sum(3);

    printf("answer = %d\n", answer);

    return 0;
}

int Sum(const int value)
{
    if (value > 0) {
        return value + Sum(value - 1);
    }
    else {
        return 0;
    }
}

<実行結果>

answer = 6
続行するには何かキーを押してください・・・

戻り場所については省いて説明します。

1.main関数からSum関数(1回目:引数3)が呼び出されます。

2.1回目:引数valueは0より大きいので、計算式に入ります。

  return文は計算した後で実行されますので、先に

   value + Sum(value - 1)

  が実行されます。

  これは、

   3 + Sum(2)

  と同じ意味です。

  この時点で、Sum関数(2回目:引数2)が呼び出されます。

3.2回目:引数valueは0より大きいので、計算式に入ります。

  ここでは、

   2 + Sum(1)

  という計算をしようとします。

  この時点で、Sum関数(3回目:引数1)が呼び出されます。

4.3回目:引数valueは0より大きいので、計算式に入ります。

  ここでは、

   1 + Sum(0)

  という計算をしようとします。

  この時点で、Sum関数(4回目:引数0)が呼び出されます。

5.4回目:引数が0なので、0を返却し4回目の関数を終えます。

6.3回目の関数が4回目の関数から戻ってきた「0」を受け取り、

   1 + 0 → 1

  を返却(return)し3回目の関数を終えます。

7.2回目の関数が3回目の関数から戻ってきた「1」を受け取り、

   2 + 1 → 3

  を返却し2回目の関数を終えます。

8.1回目の関数が2回目の関数から戻ってきた「3」を受け取り、

   3 + 3 → 6

  を返却し1回目の関数を終えます。

9.main関数が1回目の関数から戻ってきた「6」を受け取り表示します。

慣れてくると感覚で理解できるのですが、慣れるまでが大変かも知れません。

これを利用して、再帰呼び出し定番の階乗を求めるプログラムを書きます。

下のプログラムでは、5の階乗を求めています。

  5×4×3×2×1=120

という計算ですね。

<sample program 149-04>

#include <stdio.h>

int Factorial(const int value);

int main(void)
{
    int answer;

    answer = Factorial(5);

    printf("answer = %d\n", answer);

    return 0;
}

int Factorial(const int value)
{
    if (value > 0) {
        return value * Factorial(value - 1);
    }
    else {
        return 1;
    }
}

<実行結果>

answer = 120
続行するには何かキーを押してください・・・

様々なプログラムサイトで紹介されていますので、探してみてください。

ただ、階乗を求めるプログラムをいつ使うのか・・・

次回はもう少し再帰の使い道について踏み込んでみましょう。


次へ

戻る

目次へ