Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
此递归程序的堆栈溢出错误?-C++; 我是第一个C++类的编程学生,最近我们被赋予了一个任务来实现递归程序,它在给定的字符串中找到给定子串的第一个发生。_C++_Recursion_Stack Overflow - Fatal编程技术网

此递归程序的堆栈溢出错误?-C++; 我是第一个C++类的编程学生,最近我们被赋予了一个任务来实现递归程序,它在给定的字符串中找到给定子串的第一个发生。

此递归程序的堆栈溢出错误?-C++; 我是第一个C++类的编程学生,最近我们被赋予了一个任务来实现递归程序,它在给定的字符串中找到给定子串的第一个发生。,c++,recursion,stack-overflow,C++,Recursion,Stack Overflow,例如: int StringIndex("Mississippi", "sip"); // this would return 6 我们得到的提示是使用递归辅助函数,该函数将索引作为参数 以下是我迄今为止所做的工作: int index_of(string s, string t) { int index = 0; if (s[index] == NULL) return -1; else if (starts_with(s, t, ++index))

例如:

int StringIndex("Mississippi", "sip"); // this would return 6
我们得到的提示是使用递归辅助函数,该函数将索引作为参数

以下是我迄今为止所做的工作:

int index_of(string s, string t)
{
    int index = 0;

    if (s[index] == NULL)
        return -1;
    else if (starts_with(s, t, ++index))
    {
        return index;
    }
    return index_of(s, t);
}

bool starts_with(string s, string t, int index)
{
    if (t[index] != s[index] || s[index] == NULL)
        return false;
    return starts_with(s, t, ++index);
}
我得到一个堆栈溢出错误,我不明白为什么。有人能帮我理解为什么我会犯这个错误吗?并帮助我找到正确的方向,了解如何修复它?

当你说:

s[index] == NULL

您应该注意到C++的STD::string不需要在内部终止NULL,而是使用string的<代码> siz()< /COD>成员函数来代替。此外,您正在按值传递字符串,对于长字符串,这可能会迅速占用堆栈空间和动态内存。将它们作为常量引用传递:

bool starts_with( const string & s, const & string t, int index)
{
   ...
}
最后,正如其他人所指出的,只有一个函数,在本例中,
start\u with()
应该是递归的。事实上,
index_of()
似乎毫无意义

int index_of(string s, string t)
{
    ...

    // Your are calling yourself without modifying the
    // input parameters.  If you get here once, you'll
    // never break out.
    return index_of(s, t);
}

没有任何东西会改变
s
t
,因此这永远不会停止。

编写递归函数时,应始终牢记两件事:需要终止递归的停止条件,并且每次函数调用都必须接近停止条件。如果您未能检查停止条件,或者如果您的函数在每次调用期间没有接近停止条件,您将遇到堆栈溢出(或无限循环)

第一个函数的问题是它没有接近停止条件。最后,您“返回(s,t)的索引_”,同时不修改s或t。因此,函数将使用相同的参数一次又一次地重新启动,直到遇到堆栈溢出

另一个问题是在你的函数中。它只返回false,但从不返回true。

A)“以”从不返回true开始。所以你永远不会退出递归的索引。\br> B) 索引对递归没有任何作用,它只是使用相同的信息再次调用自己。


基本上,上述2个问题会导致无限循环。你经常检查相同的信息,没有退出这个循环的可能性。

如果你原谅一种指出一些人可能认为有点太可爱的错误的方式,考虑一下:

之间的区别。

以及:


如果您不理解

另外,条件
t[index]!=s[index]| | s[index]==NULL
应该反转,否则您将在检查边界本身之前检查边界之外的内容。此外,++index没有什么意义。实际上,索引_中的整个变量没有什么意义。请尝试使用调试器逐步完成例程的运行,或者如果不想弄乱调试器,请在函数中的各个点上放置printf()调用。然后在输出重定向到文件的情况下运行程序,在程序崩溃后,检查文件的内容。。。从一个文件的内容,你可以看到你的程序在做什么,它会变得清晰,为什么它会无限期地递归并溢出堆栈。离题但我很好奇:在提交答案之前,你怎么知道链接是什么?看起来你并不是为了修补它而编辑的。@Dan:事实上是我编辑的。据我所知,如果你在几秒钟内编辑,它不会显示为编辑。投票结果是一个有效的(如果有点混乱)答案和一个koan。