1

私の C++ の本から次の質問に答えようとしています。部屋には n 人がいます。n は 2 以上の整数です。各人は他のすべての人と 1 回握手します。部屋での握手の総数は? この問題を解決する再帰関数を書きます。プログラムを書きましたが、関数から何も出力されません。ハンドシェイク関数内の内容は正しいと確信していますが、メイン関数内の関数によって何も出力されていません。エラーが発生し続けます: Problem2.exe の 0x00c01639 で未処理の例外: 0xC00000FD: スタック オーバーフロー。事前に助けてくれてありがとう!

#include <iostream>
#include <conio.h>

using namespace std;

int handshake(int n);

int main()
{
    int i, n;

cout<<"How many people are in the room? ";
cin>>i;


for (n = 1; n = i; n++)
{
    handshake(n);
}

cout<<"There are "<<handshake(n)<<" in the room"<<endl;

getche();
return 0;
}

int handshake(int n)
{
    if (n == 1)
    {
            return 0;
        }
    else if (n == 2)
    {
                        return 1;
}
else
{
    return (handshake(n) + (n - 1));
}
}
4

2 に答える 2

1

問題は、への呼び出しが再度handshake(n)の再帰呼び出しを行ってhandshake(n)おり、この無限の再帰呼び出しによりスタックが爆発するために発生するスタックオーバーフローが原因です。

再帰呼び出しは、基本条件につながる値に近い引数で呼び出す必要があり0ます1

あなたの場合、正しい再帰呼び出しは次のとおりです。

return (handshake(n-1) + (n - 1));

パーティーでの握手の回数の再帰的な式は次のとおりです。

H(n) = H(n-1) + n-1

とwhereはパーティの人数であり、パーティの全員がパーティH(1) = 0の他の全員と握手したときの握手の回数です。H(2) = 1nH(n)

forループの条件も:

for (n = 1; n = i; n++)

に割り当てiますn。しかし、あなたが望むのは、値を次のように比較することです:

for (n = 1; n <= i; n++)
于 2012-10-27T05:06:19.420 に答える
1

あなたの問題はここにあります:

return (handshake(n) + (n - 1));

handshake(n)の呼び出しで返され、handshake(n)無限再帰の土地に投げ込まれていることに注意してください(そして、呼び出しスタックがオーバーフローするため、エラーが発生します)。

これは宿題のように聞こえるので、具体的な解決策は示しません。私は次の発言をします。

  • 再帰関数には、基本ケース (持っているもの) と再帰ステップ (修正する必要があるもの) が必要です。特に、f(x)が再帰関数の場合、その結果は に依存する必要があります。f(x-e)ここで、eは厳密に 0 より大きくなります。
  • メイン コードで再帰関数を 1 回だけ呼び出す必要があります。必要に応じて自分自身を呼び出します。
于 2012-10-27T05:06:50.310 に答える