问题:实现 pow(x, n).
看起来很简单,直接递归实现,考虑n<0情况。
double pow(double x, int n)
{
if(n == 0)
return 1.0;
if(n<0)
return 1.0/pow(x, -n);
return x*pow(x, n-1);
}
虽然是 O(n)复杂度,但发现还是运行超时。于是寻求快速算法,发现x的2n次方等于x的n次方相乘,这样每步可以减少n次相乘,复杂度变为O(logn)。
double power(double x, int n)
{
if (n == 0)
return 1;
double v = power(x, n / 2);
if (n % 2 == 0)
return v * v;
else
return v * v * x;
}
double pow(double x, int n) {
if (n < 0)
return 1.0 / power(x, -n);
else
return power(x, n);
}