这个递归代码有什么问题? 我正在使用CdELAB做C++的在线工作,我不确定我的代码有什么问题。问题是:

这个递归代码有什么问题? 我正在使用CdELAB做C++的在线工作,我不确定我的代码有什么问题。问题是:,c++,recursion,stack-overflow,C++,Recursion,Stack Overflow,编写一个递归的int值函数len,它接受字符串并返回字符串中的字符数。 字符串的长度为: 如果字符串为空字符串(“”),则为0。 1大于第一个字符以外字符串其余部分的长度 这是我的代码: int len(string s) { if (s.length()==0) return 0; else { return 1+(len(s)-1); } } 它说我有一个运行时错误。 有什么帮助吗 谢谢 那么这里: return 1+(len(s)-1); 绳子的长度

编写一个递归的int值函数len,它接受字符串并返回字符串中的字符数。 字符串的长度为: 如果字符串为空字符串(“”),则为0。 1大于第一个字符以外字符串其余部分的长度

这是我的代码:

int len(string s)
{
  if (s.length()==0)
    return 0;
 else
 {
    return 1+(len(s)-1);
 }
}
它说我有一个运行时错误。 有什么帮助吗

谢谢

那么这里:

     return 1+(len(s)-1);
绳子的长度永远不会减少。因此,最终会出现堆栈溢出,因为您从未达到基本大小写
(s.length()==0)。
您需要得到一个子字符串,其中s的长度减少1:

     return 1+(len(s.erase(0,1))); // erases 1 char from beginning then recurses
希望这纯粹是学术性的,因为
std::string
有一个
length
方法,可以在固定时间内运行。(更不用说从字符串前面擦除可能效率极低——请参见其他与
char*
相关的答案)

这里:

     return 1+(len(s)-1);
绳子的长度永远不会减少。因此,最终会出现堆栈溢出,因为您从未达到基本大小写
(s.length()==0)。
您需要得到一个子字符串,其中s的长度减少1:

     return 1+(len(s.erase(0,1))); // erases 1 char from beginning then recurses
希望这纯粹是学术性的,因为
std::string
有一个
length
方法,可以在固定时间内运行。(更不用说从字符串前面擦除可能效率极低——请参阅使用
char*
的其他答案)

len(s)永远不会减少并导致堆栈溢出。我会这样做:

int len(const char * s) {
    if(*s == '\0')
        return 0;
    else
        return 1 + len(s+1); 
}
len(s)永远不会减少并导致堆栈溢出。我会这样做:

int len(const char * s) {
    if(*s == '\0')
        return 0;
    else
        return 1 + len(s+1); 
}

您从未在代码中修改
s
,因此如果
s
不是空的,您将继续使用相同的参数调用相同的函数;你永远不会停止。计算机堆栈空间不足,程序崩溃

其他人给了你一些想法/选择。以下是我的建议:

int len(const std::string &s, int start)
{
    /* If we are starting at the end, there's no more length */
    if(start == s.length())
        return 0;

    /* one plus whatever else... */
    return 1 + len(s, start + 1);
}
假设
str
是要获取长度的字符串,可以将其称为:
len(str,0)

如果需要使用
常量字符*
版本,请尝试以下操作:

int len(const char *s)
{
    if((s == NULL) || (*s == 0))
        return 0; /* we ran out of string! */

    return 1 + len(s + 1);
}

您从未在代码中修改
s
,因此如果
s
不是空的,您将继续使用相同的参数调用相同的函数;你永远不会停止。计算机堆栈空间不足,程序崩溃

其他人给了你一些想法/选择。以下是我的建议:

int len(const std::string &s, int start)
{
    /* If we are starting at the end, there's no more length */
    if(start == s.length())
        return 0;

    /* one plus whatever else... */
    return 1 + len(s, start + 1);
}
假设
str
是要获取长度的字符串,可以将其称为:
len(str,0)

如果需要使用
常量字符*
版本,请尝试以下操作:

int len(const char *s)
{
    if((s == NULL) || (*s == 0))
        return 0; /* we ran out of string! */

    return 1 + len(s + 1);
}
另一个解决方案:

int len(string s)
  {
  if (s.length()==0)
      return 0;
  else
     {
     s = s.substr(0, s.size()-1);
     return 1+(len(s));
     }
  }
另一个解决方案:

int len(string s)
  {
  if (s.length()==0)
      return 0;
  else
     {
     s = s.substr(0, s.size()-1);
     return 1+(len(s));
     }
  }

该死的。。。我的老板突然来了,我不得不停止打字+1:我知道你在说什么,但它说“比第一个字符以外的字符串的其余部分的长度多1个”,我如何解释这一点?堆栈溢出。真是恰到好处!该死的。。。我的老板突然来了,我不得不停止打字+1:我知道你在说什么,但它说“比第一个字符以外的字符串的其余部分的长度多1个”,我如何解释这一点?堆栈溢出。真是恰到好处!我怀疑作业是否希望您使用
std::string
。它看起来更像是希望您手动确定
const char*
字符串的长度。我怀疑该赋值是否希望您使用
std::string
。它看起来更像是希望您手动确定
const char*
字符串的长度。