【发布时间】:2015-02-14 12:16:26
【问题描述】:
使用以下签名编写函数
strstr,使其成为递归函数(不是递归包装器)。
简而言之,strstr 返回 substr 首先出现在 str 中的位置的索引,如果没有找到,则返回 -1。更多here
这是我的尝试:
int strstr1(char *str, char *substr){
if (*str == 0 || *substr == 0)//basis, if any of the strings is empty, will return -1
return -1;
else{
strstr1(str + 1, substr); //forward the address of str
if (*str == *substr) //for each level check if the first char matches, then it should match each pair
strstr(str + 1, substr + 1);
但我被卡住了。我意识到在递归中可能需要回溯,但我不知道如何去做,也不知道如何通过所有级别的递归传递索引......
请问有什么提示或建议吗?
【问题讨论】:
-
你的 strstr() 函数可以调用其他函数。在 str1 中匹配 str2 的第一个字符后,只要下一个字符也匹配,就可以递归调用“strmatch()”。如果整个 str2 匹配,strmatch() 将返回成功,否则失败。如果它返回成功,你就完成了。如果返回失败,则递归地进入 str1 并在第一个字符匹配后重试。
-
@user2225104 但是如何将正确的索引传递到所有级别?
-
返回索引时似乎需要原始指针或累加器。
-
为用户函数使用库名称是一个非常糟糕的主意。我知道这应该是一个学习练习,但他们可以将函数命名为
my_strstr()或其他名称。 -
不需要“回溯”。您只需要正确地进行递归,返回递归调用的返回值。如
return strstr(str + 1, substr);等