所以我想弄清楚如何做到这一点:
编写一个递归函数,它将对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]的东西。有谁知道我应该用它做什么?我不是在寻找代码中的答案,只需要帮助我实现这一目标。
答案 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))
调用该函数。
所以你的基本案例是character[index] == empty
您的归纳案例大致为1 + function(stringName, index + 1)
。
此外,这有点超出了您的问题范围,但您也可以通过避免不断构建堆栈来提高效率。一种方法是在函数内创建另一个连续累积总计数的变量。有关详细信息,请参阅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));