再帰関数を利用して、アッカーマン関数を計算します。
再帰関数とは、以下のようにある関数内でその関数自身の呼び出しを含む関数のことをいいます。
// 再帰関数の例
int func(void)
{
return func(); // 自分自身の関数を呼び出す
}
再帰を使用すると、プログラムを簡潔に書くことができるメリットがありますが、実行速度が遅くなり、メモリの消費量が増えるなどデメリットもあります。アッカーマン関数は計算量が膨大であるため、スタックオーバーフローを起こす可能性があります。
以下がアッカーマン関数(Ackermann関数)の定義です。
以下のサンプルプログラムでは、アッカーマン関数を再帰関数により求めています。
/****************************************************************************/ #include<stdio.h> // アッカーマン関数 int ack(int x, int y) { // 引数チェック if(x < 0 || y < 0) { fprintf(stderr, "x,yの値が正しくありません。\n"); return 0; // 異常終了 } if(x == 0) { return y + 1; } if(y == 0) { return ack(x - 1, 1); } return ack(x - 1, ack(x, y - 1)); } int main() { // 変数定義 int x, y; int ans; // 変数の初期化 x = 0; y = 0; ans = 0; // 値の設定1 x = 3; y = 3; ans = ack(x, y); // アッカーマン関数の呼び出し fprintf(stdout, "ack(%d, %d) = %d\n", x, y, ans); // 値の設定2 x = 1; y = 1; ans = ack(x, y); // アッカーマン関数の呼び出し fprintf(stdout, "ack(%d, %d) = %d\n", x, y, ans); // 値の設定3 x = 0; y = 20; ans = ack(x, y); // アッカーマン関数の呼び出し fprintf(stdout, "ack(%d, %d) = %d\n", x, y, ans); return 0; } /****************************************************************************/
Copyright(c) 2010 , cgengor
このWebページの内容を無断で複製または転載することを禁じます。
このWebページの情報を利用することにより発生したいかなる損害について著作権保有者はいっさいの責任を負いません。