我是第一个C ++类的编程学生,最近我们获得了一个赋值来实现一个递归程序,该程序找到给定字符串中给定子字符串的第一次出现。
例如:
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);
}
我收到堆栈溢出错误,我不明白为什么。那么有人会介意帮助我理解为什么我会收到这个错误吗?并帮助我指出如何解决它的正确方向?
答案 0 :(得分:6)
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
,因此永远不会停止。
答案 1 :(得分:4)
在编写递归函数时,您应该始终记住两件事:您需要停止条件来结束递归,并且您必须在每次函数调用时更接近停止条件。如果您未能检查停止条件,或者如果您的函数在每次调用期间没有接近停止条件,您将遇到堆栈溢出(或无限循环)。
你的第一个功能的问题是它没有接近停止条件。最后你“返回index_of(s,t)”而不同时修改s或t。因此,函数将一次又一次地使用相同的参数重新开始,直到遇到堆栈溢出。
另一个问题是你的starts_with函数。它只返回false但从不真实。
答案 2 :(得分:2)
当你说:
s[index] == NULL
你应该知道C ++ std :: strings不需要在内部以null结尾 - 而是改用字符串的size()
成员函数。此外,您正在按值传递字符串,对于长字符串,这可能会快速占用堆栈空间和动态内存。将它们作为const引用传递:
bool starts_with( const string & s, const & string t, int index)
{
...
}
最后,正如其他人所指出的那样,只有一个函数,在这种情况下starts_with()
应该是递归的。事实上,index_of()
似乎毫无意义。
答案 3 :(得分:1)
A)“starts_with”从不返回true。所以你永远不会退出index_of递归
B)index_of对recurse没有任何作用,它只是用相同的信息再次调用自己。
基本上上述2问题导致无限循环。您经常检查相同的信息,并且无法退出该循环。
答案 4 :(得分:1)