实现函数
pow(double base, int exponent)
常规的思路是,循环相乘,虽然简单,也有几个要注意的地方
- 0 的负数次方是错误的输入参数,因为负数次幂是借助除法算出,0 不能作为分母
- 非0数的负数次幂是,先求正数次幂,再取倒数。
- 0 的 0 次方是无意义的 (处理 or 不处理)
而循环相乘的部分可以优化,
a^n = a^(n/2) * a^(n/2)
n为偶数
a^n =a^(n-1/2)* a^(n-1/2)*a
n为奇数
这样,O(logN)下就可以求出结果
public static double pow(double base, int exponent) throws Exception {
if (base == 0 && exponent <= 0) {
throw new Exception("error");
}
if (exponent < 0) {
return 1/power(base, -exponent);
} else {
return power(base, exponent);
}
}
private static double power(double base, int exponent) {
if (exponent == 0) {
return 1;
} else if (exponent == 1) {
return base;
} else {
double result = power(base, exponent/2);
result *= result;
if (exponent % 2 == 1) {
result *= base;
}
return result;
}
}