此递归程序的堆栈溢出错误?-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。