Recursion
再帰は、関数内に自分自身の呼び出しが含まれている場合に発生します。再帰により、非常に簡潔で洗練された、直感的に理解しやすいコードを作成できます。ただし、再帰が深くなりすぎると、大量のメモリが消費される可能性があります。
再帰が使用される一般的な例:
- リンクリスト、二分木などの再帰データ構造の探索
- チェスなどのゲームにおけるシナリオの探索
再帰は常に2つの主要な部分から構成されます。再帰がいつ終了するかを示す終了ケースと、終了ケースに向かって進む必要がある自分自身の呼び出しです。
例えば、この関数は再帰的に加算することで乗算を実行します。
#include <stdio.h>
unsigned int multiply(unsigned int x, unsigned int y)
{
if (x == 1)
{
/* 終了させる */
return y;
}
else if (x > 1)
{
/* 再帰ステップ */
return y + multiply(x-1, y);
}
/* xが0のとき */
return 0;
}
int main() {
printf("3 times 5 is %d", multiply(3, 5));
return 0;
}
Exercise
再帰乗算によって階乗を計算する factorial() という新しい関数を定義します (5! = 5 x 4 x 3 x 2 x 1)。慣例により、0の階乗は1に等しい (0! = 1) ことに注意してください。