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

Length character count using recursive function

本文关键字:字符 递归函数      更新时间:2023-10-16

我正在尝试创建一个可以计算字符串字符的递归函数,但我不知道为什么我的代码使我的系统崩溃。我没有更多的想法了。任何建议:

long slength (const char ntca[])
{
    int length = 0;
    if (ntca[length] == ''){
        return 0;
    }
    else{
        return  slength(ntca)+1;
    }
}

当前代码以递归方式调用同一缓冲区的slength。 这将持续到堆栈溢出。

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

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

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

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

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

return  slength(ntca+1)+1;

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

代码中尝试之前,您应该使用铅笔和纸来完成算法。

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

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

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

long slength (const char ntca[], int n) //Look from n to the end of string for ''
{
    if (ntca[n] == '')
        return n; //the index of char '' indicates the length of string 
    else
        return  slength(ntca, n+1); //go, check the next char
}

因此,您始终必须按如下方式调用此函数:x = 长度(s, 0)