【问题标题】:What is this code doing? C/C++这段代码在做什么? C/C++
【发布时间】:2015-01-16 21:48:36
【问题描述】:

有人能说出这个递归函数实际上在做什么吗?我认为它什么都不做,它返回 0 并且程序停止。

对于字符串:honolulu\0

int fun(char *string){
    if(*string != 'u') return 0;
    return 1 + fun(string + 1);
}

【问题讨论】:

  • 这是邪恶!提示:如果你的字符串不包含任何u,你会得到一个段错误。否则,它将仅计算给定字符串的第一个 u 之前的字符数
  • 运行看看怎么样?如果你愿意,你甚至可以打印出 1 + fun(string + 1); 的结果
  • 它从头开始计算连续的'u'
  • 另外,没有像“C/C++”这样的语言。 C 和 C++ 是两种非常不同的语言,即使它们的部分语法相似。
  • @Rerito,如果字符串内容是"hello\0",那么函数的第一行会在遇到'h'作为第一个字符(h!=@987654329 @)。

标签: c++ c


【解决方案1】:

它计算字符串开头的'u'的数量。

cout << fun("umbrella"); //prints: "1"
cout << fun("uumbrella"); //prints: "2"

请注意,它假定字符串以 '\0' 结尾。与许多旧的 C 字符串函数类似,它会遍历数组的末尾,直到它在内存中的某处找到一个随机的 '\0',只要它不断得到 'u'。

【讨论】:

  • @Henrik 公平点。我想我只是想解释“uuu”是一个可以传递的合法字符串。
  • @JoachimNilsson 不要忘记投反对票 didoVlad from Moscow 我只是讨厌我是唯一的人。
  • @JoachimNilsson 我喜欢不被否决。我应该如何编辑我的答案?
  • @JoachimNilsson 我不得不说在某种程度上我同意你的看法。我不想完成某人的所有家庭作业,但如果这是一个重点问题,那不就是 StackOverflow 要回答的吗?我的意思是我问了一些非常愚蠢的问题,这些问题对某些人来说似乎很简单。
【解决方案2】:

该函数返回字符串中不等于字符'u'的第一个字符的索引您可以将其视为搜索与'u'不相等的第一个字符的函数或计算多少个字符的函数'u' 在字符串的开头。

我会这样写

size_t fun( const char *s )
{
    return  *s != 'u' ? 0 : 1 + fun( s + 1 );
}

因此对于字符串文字"honolulu",该函数将返回 0,因为字符串文字不包含初始 'u'。

如果你需要在字符串中找到第一个字符'u',那么函数应该写成这样

size_t fun( const char *s )
{
    return  *s == 'u' || *s == '\0' ? 0 : 1 + fun( s + 1 );
}

在这种情况下,对于上面显示的字符串文字,函数将返回 5。它是字符串文字中第一个字符 'u' 的位置

如果你想在字符串中查找任何字符,那么函数可以定义为

size_t find( const char *s, char c )
{
    return  *s == c || *s == '\0' ? 0 : 1 + fun( s + 1, c );
}

【讨论】:

  • 我认为您在第二个示例中有错字。不应该对 `*s == '\0' 进行一项测试吗?
  • @James Kanze 是的,这是一个错字。
【解决方案3】:

本准则的作用:

您的代码计算字符串中连续u 字母的数量,并在找到不是u 的第一个字母时终止,无论它是字母还是\0。如果任何字母不是u,它将永远不会遍历整个字符串,因为序列将被破坏。
基本上它是一个recursive,如果字母不是u,基本条件使它终止,否则它将进行另一个递归调用。

您案例中的代码行为: 对于给定的输入honolulu\0,应用指向数组第一个索引(指向'h')的指针传递给函数的场景,然后它将返回0,因为在第一次比较时,它会发现一个不是u 的字母,因此它将从那里返回,因此不会进行可以返回非零整数的递归调用,因此输出肯定是0

希望这会有所帮助。

【讨论】:

    【解决方案4】:

    由于您正在检查字符串中不是字符 'u' 的第一个字符,因此它通过返回 0 来终止。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-31
      • 1970-01-01
      • 2012-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多