实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
/**
* 数值的整数次方
* 实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
* 拆分的方式,即x的n次幂,可以看成是x*x的n/2次幂,不过需要判断n是奇数还是偶数,如果是奇数,则需要再乘以一个x
* 以此类推,如果n是奇数,那么n/2是偶数,那么n/4就是奇数,此时将x*x看成是base,则x的n次幂可以看成是
* x*(x*x)^(n/2)=x*((x*x)*(x*x*x*x)^(n/4))
* 比如x=2,n=11,那么可以看成是2*(2*2)^(11/2),而在程序中,11/2=5,递归得到
* 2*((2*2)*(2*2*2*2)^(5/2)),此时5/2=2,再一次递归,则将(2*2*2*2)看成是本次递归的base
* 2*((2*2)*((2*2*2*2)*(2*2*2*2))^(2/2))
* 计算方式,其实就是通过递归的方式,将base做平凡,而将次幂除以2,如果次幂除以2之后得到的是一个奇数,则在计算的时候需要优先乘以一个base
* @param x
* @param n
* @return
*/
private boolean isNegative = false;
public double myPow(double x, int n) {
if (n == 0) {
return 1;
}
if (n == 1) {
return x;
}
if (n < 0) {
n = -n;
isNegative = true;
}
double power = myPow(x * x, n / 2);
// 如果n是奇数,则需要再乘以一个
if (n%2 != 0) {
power = power * x;
}
// 如果n是负数,则需要取反
return isNegative?1/power:power;
}