【问题标题】:Recursive Function Scanning String to Add ASCII递归函数扫描字符串以添加 ASCII
【发布时间】:2013-03-31 08:54:50
【问题描述】:

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

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

【问题讨论】:

  • c 字符串不是 char* 吗?
  • exit(0) 在空字符串的情况下?废话,只返回0就够了

标签: c++ string recursion


【解决方案1】:

骨架可能是这样的:

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

剩下的就看你了:)

【讨论】:

  • return *str + countlen(str + 1),我想。
  • char 是否被视为 C++ 字符串的 C 版本?我已经在字符串递归中看到了 this 的一些用法,但不明白为什么使用 char 优于字符串
  • 是的,C 字符串由 'char[]'、'char *' 和 'const char *' 表示。您的分配明确表示要使用 C 字符串,而不是 C++ 字符串('std::string')。
【解决方案2】:
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)

此外,这有点超出您的问题范围,但您也可以通过避免不断建立堆栈来提高效率。一种方法是在函数内部创建另一个变量,该变量不断累积总计数。有关这方面的更多信息,请参阅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)); 拨打电话

【讨论】:

    【解决方案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;
    

    【讨论】:

    • 所以基本上你一直调用这个函数直到你到达终点。然后递归又回来了。中途添加每一步。
    • 好的,这是有道理的,这就是我想要弄清楚的。我不确定在函数调用中使用 int i 是否可行。我唯一不明白的部分是为什么需要 +1,这是做什么的?
    • +1 是这样当你再次调用该函数时,它会移动到单词中的下一个字母。因此,第一次调用该函数时,您位于“HELLO”中的字母“H”上。第二次调用它时,您在“E”上,依此类推。最后,当您在字母“O”上时,您开始将相应的 ASCII 值相加,当您开始返回值时,它们将被添加到首先调用它的函数中的值中。根据经验,如果您在 for 循环中使用“计数器”变量。您所要做的就是使用“counter + 1”值再次调用递归函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 2014-11-26
    • 2020-03-08
    • 1970-01-01
    相关资源
    最近更新 更多