1

我试图从我的 C++ 书中回答这个问题:房间里有 n 个人,其中 n 是大于或等于 2 的整数。每个人与其他人握手一次。房间里握手的总数是多少?写一个递归函数来解决这个问题。我编写了一个程序,但该函数没有输出任何内容。我很确定握手函数中的内容是正确的,但是主函数中的函数没有输出任何内容。它一直给我一个错误: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

其中的基本条件是党内人数,是党内H(1) = 0每个人与党内其他人握手时的握手次数。H(2) = 1nH(n)

还有你的 for 循环中的条件:

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

将分配in。但是您想要的是将值比较为:

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

你的问题在这里:

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

请注意,您正在返回handshake(n)对 的调用handshake(n),将您抛入无限递归领域(并导致调用堆栈溢出,从而导致您的错误)。

这听起来像家庭作业,所以我不会给出任何具体的解决方案。我将发表以下评论:

  • 递归函数需要有一个基本案例(你有)和一个递归步骤(你需要修复)。特别是, iff(x)是一个递归函数,其结果应取决于f(x-e),其中e严格大于 0。
  • 您只需要在主代码中调用一次递归函数;它会在需要时自行调用。
于 2012-10-27T05:06:50.310 回答