递归算法的时间复杂度本质:递归的次数 * 每次递归中的操作次数。
例:求x的n次方,有多少种写法?
第一种:
int help(int x, int n) {
int res = 1;
for (int i = 0; i < n; i++) {
res = res * x;
}
return res;
}
时间复杂度为O(n)
第二种:
int help1(int x, int n) {
if (n == 0) {
return 1;
}
return help1(x, n - 1) * x;
}
每次n-1,递归了n次时间复杂度是O(n),每次进行了一个乘法操作O(1)
时间复杂度O(n)
第三种:
int help2(int x, int n) {
if (n == 0) {
return 1;
}
int a = help2(x, n / 2);
if (n % 2 == 1) {
return a * a * x;
}
return a * a;
}
仅仅有一个递归调用,且每次都是n/2 ,所以这里我们一共调用了log以2为底n的对数次。每次递归了做都是一次乘法操作 O(1)
时间复杂度 O(logn)