有人可以告诉这个递归函数实际上在做什么。我认为它什么也没做,它返回0并且程序停止。
对于字符串:honolulu\0
int fun(char *string){
if(*string != 'u') return 0;
return 1 + fun(string + 1);
}
答案 0 :(得分:2)
它会计算字符串开头的数量。
cout << fun("umbrella"); //prints: "1"
cout << fun("uumbrella"); //prints: "2"
请注意,它假设字符串是&#39; \ 0&#39;终止。与许多旧的C字符串函数类似,它将迭代数组的末尾,直到找到随机的&#39; \ 0&#39;在记忆的某个地方,只要它不断得到你的。
答案 1 :(得分:1)
该函数返回字符串中第一个字符的索引,该字符串不等于字符'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 );
}
答案 2 :(得分:1)
守则的作用:
您的代码会计算字符串中连续=VLOOKUP(IF(ISERROR(LEFT(B10,FIND(",",B10,1))),B10,LEFT(B10,FIND(",",B10,1))),D10:D12,1,TRUE)
个字母的数量,当它找到不是u
的第一个字母时,它会终止,无论是字母还是u
。如果任何字母不是\0
,它将永远不会遍历整个字符串,因为序列将被破坏
基本上它是recursive,如果字母不是u
,则基本条件使它终止,否则它将进行另一次递归调用。
您案件中代码的行为:
对于给定的输入u
,将指向数组的第一个索引(指向'h')的指针应用于该函数,然后它将返回honolulu\0
,因为在第一次比较时,它会找到一个不是0
的字母,因此它将从那里返回,因此不会进行递归调用,可以返回非零整数,因此输出肯定是u
。
希望这有帮助。
答案 3 :(得分:-1)
由于您要检查字符串中的第一个字符,而不是字符&#39; u&#39;所以它通过返回0终止。