递归函数扫描字符串以添加ASCII

时间:2013-04-09 04:24:43

标签: c++ string recursion

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

  

编写一个递归函数,它将对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]的东西。有谁知道我应该用它做什么?我不是在寻找代码中的答案,只需要帮助我实现这一目标。

3 个答案:

答案 0 :(得分:3)

骷髅可能是这样的:

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

其余由您决定:)

答案 1 :(得分: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;

答案 2 :(得分: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.因此,对于字符长度为3,它将执行1 + 1 + 1 + 0.您可以使用printf("%d\n", countString(yourStringName, 0))调用该函数。

  1. 所以你的基本案例是character[index] == empty

  2. 您的归纳案例大致为1 + function(stringName, index + 1)

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

    <小时/> 更多记忆保守版:

    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));

    进行调用