2

ループ内で再帰関数を呼び出すと、2つの問題が発生します。次のサンプルコードを検討してください。

int fact(int x)
{
    if(x == 1)
        return 1;
    return x*fact(x-1);
}

int main() { 
    int n = 2;
    for(int i = 0; i < n; i++);
        std::cout << fact(4) << std::endl; // 24 ??
    return 0;
}

問題1:このプログラムで期待した結果は24 24(プリンターの場合は2倍24)ですが、実際の結果は1つだけ24です。

問題2:main()メイン関数を再帰的に呼び出さなくても、関数が繰り返し呼び出される理由は何ですか。

複数の出力を取得するためにループ内で再帰関数を呼び出す方法について誰かが私に考えてくれたら素晴らしいと思います。

4

1 に答える 1

12
for(int i=0; i < n; i++); <---------------------- notice this
       std::cout << fact(4) << std::endl; // 24 ??

ループの;後に注意してください。forこれが、出力が1つだけになる理由です。はstd::cout、ループが終了した後に実行されます。ループの外側にあります。

それがあなたの最初の質問に対する答えです。次に2番目の質問:

main関数を再帰的に呼び出さなくても、main()関数が繰り返し呼び出される理由は何ですか。

あなたが投稿したコードにこの問題はないと思います。main()再帰的に呼び出されるため、投稿していないコードで何か他のことをしている必要があります。

コードmain()からの呼び出し(再帰的またはその他)は、C++言語仕様によって禁止されていることに注意してください。したがって、GCCを使用してオプションでコンパイルする場合、偶然にプログラムから呼び出してもコンパイルされないはずです。-pedanticmain()

于 2012-05-06T16:31:55.090 に答える