我试图从我的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));
}
}
答案 0 :(得分: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) = 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。