这个递归程序的堆栈溢出错误? - C ++

时间:2010-02-21 19:29:36

标签: c++ recursion stack-overflow

我是第一个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);
}

我收到堆栈溢出错误,我不明白为什么。那么有人会介意帮助我理解为什么我会收到这个错误吗?并帮助我指出如何解决它的正确方向?

5 个答案:

答案 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);
}

没有任何更改st,因此永远不会停止。

答案 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)

如果您原谅指出某些人可能认为有点太可爱的错误的方法,请考虑以下区别:

See this answer

如果您不理解see this answer