在线评委的SIGSEGV错误

时间:2014-02-05 18:15:01

标签: c++ recursion combinations sigsegv

以下代码通过递归调用给出了两个数字(nCr)的组合,是以下问题的解决方案:

罗希特梦想他在一家拥有无限大理石的商店里。他被允许选择n弹珠。有不同颜色的大理石。从每种颜色,也有无限多的大理石。罗希特想要每种颜色至少有一种大理石,但他的选择仍有很多可能性。在他努力做出决定时,他醒来了。 现在他问你有多少可能选择他的选择。 假设无法区分相同颜色的大理石,并且大理石的顺序无关紧要。 输入

第一行输入包含数字T <= 100,表示要遵循的测试用例数。每个测试用例由一行包含n和k组成,其中n是Rohit选择的弹珠数,k是弹珠的不同颜色数。您可以假设1 <= k <= n <= 1000000。 输出

对于每个测试用例,打印出Rohit可能具有的可能性。 您可以假设此数字适合带符号的64位整数。 实施例

输入: 2 10 10 30 7

输出: 1 475020

这是我解决问题的方法:

#include<iostream>
using namespace std;

long long int C(int n,int r)
{
    if(r==1)
        return n;
    if(n==r)
        return 1;
    long long int c=C(n-1,r)+C(n-1,r-1);
    return c;
}

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,r;
        cin>>n>>r;
        cout<<C(n-1,r-1)<<endl;
    }
}

我的问题在于我的gcc编译器CodeBlocks代码运行顺利,没有任何错误,并给出了写回答,但在线判断给我一个运行时错误:SIGSEGV。 我搜索了错误,它与程序使用多余的内存有关,但我仍然无法在我的代码中找到错误。 那么请告诉我,我的代码可以修改以适应问题的条件,还是我必须从新的角度思考?

2 个答案:

答案 0 :(得分:1)

如果r == 1,则n大于r。当第一次调用该函数时,局部变量r将为0,因此对于递归C(n-1,r-1),r将永远不会为1,并且n将永远不会等于r。所以递归C(n-1,r-1)不能结束。它会堆叠溢出。

答案 1 :(得分:0)

您的问题包含堆栈溢出)。函数调用在堆栈上分配内存(小的(大约1-10MB)预分配内存块)以保存一些数据,以便能够在调用后返回到初始位置。递归函数非常危险,因为可能存在大量嵌套调用,需要在堆栈上进行大量分配,导致其溢出并最终导致段错误。在您的情况下,请考虑输入包含两个数字 - 1000000000和1000000001.答案将是1000000001但您的实现将至少进行1000000,000次嵌套调用。这足以导致堆栈溢出。