递归的时间复杂度

简单的求x的n次方

既可以写成O(n)也可以写成O(logn)
O(n):

点击查看代码
int function1(int x, int n) {
    int result = 1;  // 注意 任何数的0次方等于1
    for (int i = 0; i < n; i++) {
        result = result * x;
    }
    return result;
}

递归后还是O(n):
因为从xxxx...变为了x(x-1)*(x-2)...

点击查看代码
int function2(int x, int n) {
    if (n == 0) {
        return 1; // return 1 同样是因为0次方是等于1的
    }
    return function2(x, n - 1) * x;
}

递归优化:
看似是O(logn),实际上还是O(n),因为虽然用了递归二叉树优化,但是具体运算的时候仍然有重复的地方

点击查看代码
int function3(int x, int n) {
    if (n == 0) {
        return 1;
    }
    if (n % 2 == 1) {
        return function3(x, n / 2) * function3(x, n / 2)*x;
    }
    return function3(x, n / 2) * function3(x, n / 2);
}
真正的优化成O(logn): 可以看到这里仅仅有一个递归调用,且每次都是n/2 ,所以这里我们一共调用了log以2为底n的对数次。 每次递归了做都是一次乘法操作,这也是一个常数项的操作,那么这个递归算法的时间复杂度才是真正的$O(\log n)$。
点击查看代码
int function4(int x, int n) {
    if (n == 0) {
        return 1;
    }
    int t = function4(x, n / 2);// 这里相对于function3,是把这个递归操作抽取出来
    if (n % 2 == 1) {
        return t * t * x;
    }
    return t * t;
}
posted @ 2022-02-20 23:46  TomoyaAT  阅读(185)  评论(0)    收藏  举报