带案例陈述的大 O 递归

Big O Recursion with a Case Statement

我有这个程序,它使用 case 语句在递归中从向后打印数组切换到向前打印数组。如果我要迭代地写这个,它将是一个带有条件逻辑的 for 循环(可以忽略);因此,Big O 将是 O(n)。我假设相同的逻辑也适用于递归程序,对吗?

    public static int recursion(int i, int j, String swap) {
        int[] testList = {0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21};
        if (j == 10) {
            return testList[10];
        }
        if (i == 10 ) {
            swap = "Yes";
        }

        switch (swap) {
            case "No":
                System.out.print(testList[i] + " ");
                i -= 1;
                break;
            case "Yes":
                System.out.print(testList[j] + " ");
                j += 1;
                break;
        }
        return recursion(i, j, swap);
    }
    public static void main(String[] args){
        String swap = "No";
        int i = 20;
        int j = 0;
        System.out.println(recursion(i, j, swap) + " ");
    }
}

我将代码简化如下,计算其时间复杂度

 public static void recursion(int[] testList, int i) { // O(n)
        int len = testList.length; // O(1)

        if(i >= len) return; // O(1)

        int idx = i <= len / 2 ? len - 1 - i: i - len / 2; // O(1)
        System.out.print(testList[idx] + " "); // O(1)

        recursion(testList, i + 1); // O(n - 1)
    }
    public static void main(String[] args){
        int[] testList = {0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21};
        recursion(testList, 0);
    }

如果我们创建一个递归关系,那么我们可以找到它的时间复杂度

T(n) = T(n - 1) + C (some constant time) (0 <= n < length)
T(n) = 1 (for n >= length)

我们可以简化等式

T(n) = T(n - 2) + 2C
     = T(n - 3) + 3C
     .
     .
     = T(n - (n - 1)) + (n - 1)C
     = T(1) + (n - 1)C
     = 1 + (n - 1)C

这给出 T(n) = O(n)