再帰関数を利用して、奇数の和、偶数の和を求めます。
再帰関数とは、以下のようにある関数内でその関数自身の呼び出しを含む関数のことをいいます。
// 再帰関数の例
int func(void)
{
return func(); // 自分自身の関数を呼び出す
}
再帰を使用すると、プログラムを簡潔に書くことができるメリットがありますが、実行速度が遅くなり、メモリの消費量が増えるなどデメリットもあります。
以下のサンプルプログラムでは、奇数の和S1(n)と偶数の和S2(n)を再帰関数を利用して求めています。
<奇数の和を求める場合の考え方>

<偶数数の和を求める場合の考え方>
奇数の和、偶数の和を求めるプログラムは、再帰関数を利用しなくても繰り返し命令などで求めることができるので、真に再帰的であるとはいえません。真に再帰的である関数には、アッカーマン関数があります。
/****************************************************************************/
#include<stdio.h>
// 奇数の合計値を再帰で求める
int odd_sum(int odd_num)
{
// 引数チェック
if(odd_num <= 0)
{
fprintf(stderr, "nの値が正しくありません。\n");
return 0; // 異常終了
}
if(odd_num == 1) // 第1項の和は1
{
return 1;
}
else // 第1項から第n項までの和は、(第1項から第n-1項までの和) + 2n - 1
{
return odd_sum(odd_num - 1) + 2 * odd_num - 1;
}
return 0;
}
// 偶数の合計値を再帰で求める
int even_sum(int even_num)
{
// 引数チェック
if(even_num <= 0)
{
fprintf(stderr, "nの値が正しくありません。\n");
return 0; // 異常終了
}
if(even_num == 1) // 第1項の和は2
{
return 2;
}
else // 第1項から第n項までの和は、(第1項から第n-1項までの和) + 2n
{
return even_sum(even_num - 1) + 2 * even_num;
}
return 0;
}
int main()
{
// 変数定義
int odd_num; // 奇数
int even_num; // 偶数
// 変数の初期化
odd_num= 0;
even_num = 0;
// 奇数の和を求める
fprintf(stdout, "奇数の和 S1(n)=1+3+...+(2n-1)を再帰で求めます\n");
odd_num = odd_sum(6); // 奇数の和を計算
fprintf(stdout, "奇数の和 S1(%d)=%d\n\n", 6, odd_num);
// 偶数の和を求める
fprintf(stdout, "偶数の和 S2(n)=2+4+...+2nを再帰で求めます\n");
even_num = even_sum(6); // 偶数の和を計算
fprintf(stdout, "奇数の和 S2(%d)=%d\n\n", 6, even_num);
return 0;
}
/****************************************************************************/

Copyright(c) 2010 , cgengor
このWebページの内容を無断で複製または転載することを禁じます。
このWebページの情報を利用することにより発生したいかなる損害について著作権保有者はいっさいの責任を負いません。