C++ 使用递归函数的长度字符计数

C++ 使用递归函数的长度字符计数,c++,recursion,C++,Recursion,我试图创建一个递归函数来计算字符串的字符数,但我不知道为什么我的代码会破坏我的系统。我没有更多的想法。 任何建议: long slength (const char ntca[]) { int length = 0; if (ntca[length] == '\0'){ return 0; } else{ return slength(ntca)+1; } } 当前代码递归调用同一缓冲区的slength。这将继续,直到

我试图创建一个递归函数来计算字符串的字符数,但我不知道为什么我的代码会破坏我的系统。我没有更多的想法。 任何建议:

long slength (const char ntca[])
{
    int length = 0;

    if (ntca[length] == '\0'){
        return 0;
    }
    else{
        return  slength(ntca)+1;
    }
}
当前代码递归调用同一缓冲区的slength。这将继续,直到堆栈溢出

您需要将缓冲区减少一个字符,并为每个递归调用的长度计数增加1

return  slength(ntca+1)+1;
//                  ^^

看看递归调用。如果ntca的长度不是零,则此函数使用完全相同的参数调用自身。这会导致无休止的递归,从而使堆栈崩溃


在代码中尝试算法之前,你应该先用铅笔和纸完成算法。

它崩溃了,因为你没有缩短字符串。这行应该是

return  slength(ntca+1)+1;

您不需要声明局部变量。该函数可以编写得更简单

size_t slength( const char s[] )
{
    return ( *s == '\0' ? 0 : 1 + slength( s + 1 ) );
}

通常,如果使用递归,则必须对较小的问题进行递归调用。在代码中,将函数调用到同一数组,或者更确切地说,调用指向数组中第一个元素的同一指针,而不是指向数组中下一个元素的指针


但是,建议不要在C++中使用递归。此外,由于这是一个非常常见的事情,因此在头文件中定义了strlen。如果C++标准库中已经有一个已知函数,请不要定义自己的函数。

您必须在递归中减少答案大小。换句话说,尝试减小字符串ntca的大小以停止无限递归。或者尝试添加一个参数来控制递归,如下所示:

long slength (const char ntca[], int n) //Look from n to the end of string for '\0'
{
    if (ntca[n] == '\0')
        return n; //the index of char '\0' indicates the length of string 
    else
        return  slength(ntca, n+1); //go, check the next char
}
因此,您必须始终按如下方式调用此函数:
x=slengths,0

我希望这纯粹是学术性的…“建议不要在C++中使用递归”。。。真正地为什么?使用C++中的递归没有什么本质上的错误,也就是说,不建议不要使用它。也就是说,您可以将其用于适当的问题。这个问题很容易通过一个简单的循环来处理,因此引入递归会增加很多不需要的额外开销。@forsvarir我应该说,在某些情况下不建议这样做。在处理递归数据结构时,有时应该使用递归。否则,如果不进行优化,可能会使代码速度慢得多。