C 求递归函数的时间复杂度

C 求递归函数的时间复杂度,c,recursion,time-complexity,C,Recursion,Time Complexity,当n1是s1的长度,n2是s2的长度时,为什么这个函数的时间复杂度是O(n1*n2) 我试图建立一个方程式,但失败了 #include <stdio.h> int f(char* s1, int i1, char* s2, int i2) { if (s2[i2] == '\0') return 1; if (s1[i1] == '\0') return 0; if (s1[i1] != s2[i2]) ret

当n1是s1的长度,n2是s2的长度时,为什么这个函数的时间复杂度是O(n1*n2)

我试图建立一个方程式,但失败了

#include <stdio.h>

int f(char* s1, int i1, char* s2, int i2) {
    if (s2[i2] == '\0')
        return 1;
    if (s1[i1] == '\0')
        return 0;
    if (s1[i1] != s2[i2])
        return f(s1, i1 + 1, s2, 0);
    return f(s1, i1+1, s2, i2+1);
}

void main() {
    printf("%d", f("hello", 0, "he", 0));
}
#包括
int f(字符*s1,字符*i1,字符*s2,字符i2){
如果(s2[i2]=='\0')
返回1;
如果(s1[i1]=='\0')
返回0;
如果(s1[i1]!=s2[i2])
返回f(s1,i1+1,s2,0);
返回f(s1,i1+1,s2,i2+1);
}
void main(){
printf(“%d”,f(“你好”,0,“他”,0));
}

a
为第一个整数索引,其中
s1[a]!=s2[a]
∧ <代码>s1[a]!='\0'∧ <代码>s2[a]!='\0'

如果
a
存在,则函数为O(n1)

否则,它是O(min{n1,n2})


简单地说,如果一个字符串是另一个字符串的右修剪版本,那么函数将是O(n),n是子字符串的大小

否则,它将是O(n1)



为了理解这一点,我建议您自己尝试函数的一些迭代,先用笔和纸,不使用最后一个
if
a
作为第一个整数索引,其中
s1[a]!=s2[a]
∧ <代码>s1[a]!='\0'∧ <代码>s2[a]!='\0'

如果
a
存在,则函数为O(n1)

否则,它是O(min{n1,n2})


简单地说,如果一个字符串是另一个字符串的右修剪版本,那么函数将是O(n),n是子字符串的大小

否则,它将是O(n1)



为了理解这一点,我建议您自己尝试函数的一些迭代,先用笔和纸,不使用最后一个
if
函数将两个尾部调用的
i1
增量
1
,因此时间复杂度为O(n1)


请注意,此函数没有实现strstrstr()的变体,因为它将无法找到与
f(“aab”,0,“ab”,0)
的匹配项。对于两个尾部调用,函数将
i1
递增
1
,因此时间复杂度为O(n1)


请注意,此函数没有实现strstrstr()的变体,因为它无法找到与
f(“aab”,0,“ab”,0)
的匹配项。至少描述了该函数应该执行的操作。为什么您认为它是n1*n2?它不是
O(n1*n2)
调用堆栈只能得到
n1-i1
深度,并且没有回溯。@pnina:您可以通过单击其分数下面的灰色复选标记来接受这个答案。至少描述一下该函数应该做什么。为什么您认为它是n1*n2?它不是
O(n1*n2)
调用堆栈只能得到
n1-i1
深度,并且没有回溯。@pnina:您可以通过单击其分数下面的灰色复选标记来接受此答案。