1

所以我试图弄清楚如何做到这一点:

编写一个递归函数,将 C 字符串中的所有字符相加。

我在正常执行此操作时有点生疏,但我终于让它与正常的 for 循环一起工作:

int countstr(string s)
{ 
int sum = 0;

  if(s.length() == 0)
    {
    exit(0);
    }
  for (unsigned int i = 0; i < s.size(); i++) 
     {
         sum += s[i];
         }
 return sum;

}

然后我可以进入 main 并执行以下操作:

int main ()
{
  cout << "This word adds up to " << countstr("HELLO") << " in ASCII " << endl;
}

一切都按原样工作,通过它们的 ASCII 数字对字符串中的字符进行计数和累加。我遇到的问题是试图弄清楚它是如何输入的,因此它可以递归地工作。我知道我需要放弃 for 循环来代替调用函数本身,但我不知道用什么来代替 sum += s[i]; 我已经进入我的 for 循环。我一直在 C 字符串库中四处寻找,但我没有看到任何可以替换 for 循环调用的 [i] 的东西。有谁知道我应该用什么来做到这一点?我不是在寻找代码中的答案,只需要帮助我应该使用什么来实现这一点。

4

3 回答 3

3

骨架可能是这样的:

int countlen(const char * str)
{
    if (condition)
        return 0;
    else
        return *str + countlen(str + 1);
}

剩下的就看你了:)

于 2013-04-09T04:36:00.287 回答
3

这是许多方法之一。

int reccountstr(string s, int i){
  if(s.size() == i)
    return (0 + s[i]);
  else
    return reccountstr(s, i + 1) + s[i];
}

然后在 main 中,您只需使用零初始参数调用它。

cout << "This word adds up to " << reccountstr("HELLO", 0) << " in ASCII " << endl;
于 2013-04-09T04:41:51.900 回答
1
int countString(char sample[], int i)
{
    if(sample[i] == 0)
        return 0;
    else
        return(1 + countString(sample, i+1));
}

这可能是一种解决方案,如果当前读取的字符不为空(0 或 '\0'),它将返回要读取的当前字符索引在1 + countString(sample, i + 1)哪里。i

一旦达到 null,它就会返回 0。因此对于三个字符长度,它将执行 1 + 1 + 1 + 0。您可以使用 . 调用该函数printf("%d\n", countString(yourStringName, 0))

  1. 所以你的基本情况是character[index] == empty

  2. 1 + function(stringName, index + 1)粗略地说,您的归纳案例是。

此外,这有点超出您的问题范围,但您也可以通过避免不断建立堆栈来提高效率。一种方法是在函数内创建另一个变量,该变量不断累积总计数。有关这方面的更多信息,请参阅http://c2.com/cgi/wiki?TailRecursion上的此链接tail recursion:


内存更保守的版本:

int countString(char sample[], int i, int total)
{
    if(sample[i] == 0)
        return total;
    else
        return countString(sample, i+1, ++total);
}

你可以用printf("%d\n", countString(sample, 0, 0));

于 2013-04-09T04:40:36.873 回答