C ++程序中未处理的异常

时间:2012-10-27 05:04:06

标签: c++ runtime-error

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

2 个答案:

答案 0 :(得分:1)

问题是因为堆栈溢出是因为对handshake(n)的调用再次对handshake(n)进行递归调用而这种无限递归调用会导致堆栈爆炸。

应该使用更接近导致基本条件的值的参数调用递归调用,01

在您的情况下,正确的递归调用是:

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

由于派对中握手次数的递归公式为:

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

基本条件为H(1) = 0H(2) = 1,其中n是聚会中的人数,H(n)是聚会中每个人的握手次数和派对上的每个人握手。

你的for循环中的条件:

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

会将i分配给n。但你想要的是将价值比较为:

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

答案 1 :(得分:1)

你的问题在这里:

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

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

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

  • 递归函数需要有一个基本情况(你有)和一个递归步骤(你需要修复)。特别是,如果f(x)是递归函数,则其结果应取决于f(x-e),其中e严格大于0。
  • 您只需在主代码中调用一次递归函数;它会在需要时自行调用。