C 我对带递归函数的Big-O表示法有点困惑

C 我对带递归函数的Big-O表示法有点困惑,c,recursion,time-complexity,big-o,computer-science,C,Recursion,Time Complexity,Big O,Computer Science,如何找到递归函数的运行时间。例如: void fun_list(LLnode_t * head) { if (head == NULL) { printf("\n"); return; } printf("%d ", head-> data); if (head->next != NULL) { fun_list(head->next); } printf("%d ", head-&

如何找到递归函数的运行时间。例如:

void fun_list(LLnode_t * head) {
    if (head == NULL) {
        printf("\n");
        return;
    }
    printf("%d ", head-> data);
    if (head->next != NULL) {
        fun_list(head->next);
    }
    printf("%d ", head->data);
} 

我知道我们应该找到递归案例和基本案例的运行时间。我认为基本情况的运行时间是O(1)。如何查找递归案例的运行时间?

时间复杂度为O(n),其中“n”是调用递归函数的次数。它基本上是通过将基本情况的复杂性乘以递归调用它的次数来计算的。所以复杂性是线性的

将每种情况的复杂度乘以它的递归次数。就像一个迭代过程,将循环体的复杂度乘以它的重复次数。就Big-O而言,循环和递归没有区别。此函数从第一个元素到最后一个元素打印列表,然后从最后一个到第一个。因此,递归案例只访问每个元素一次。然后,最后一个print语句在每次迭代中执行一次。因此,总的来说,基本情况是O(1),递归情况是O(列表的长度),最后一个print语句是O(1)。因此,函数的运行时间是O(列表的长度)。更好的解释是,每个调用都是
O(1)
,并且它递归
n次,因此它是
O(n)
。然而,更有趣的是说n如何连接到输入,而不是说“迭代次数”。否则,几乎任何东西都是O(n)。因此,在本例中,n是列表的长度。您不需要乘以基本情况的复杂性,因为它只执行一次。由于递归案例重复出现,因此会增加其复杂性。