Implement pow(x, n), which calculates x raised to the power n (xn).
Example 1:
Input: 2.00000, 10
Output: 1024.00000
Example 2:
Input: 2.10000, 3
Output: 9.26100
Example 3:
Input: 2.00000, -2
Output: 0.25000
Explanation: 2-2 = 1/22 = 1/4 = 0.25
Note:
- -100.0 < x < 100.0
- n is a 32-bit signed integer, within the range [−231, 231 − 1]
第一个想法就是直接递归:
public double myPow(double x, int n) {
if(n ==0) {
return 1;
}else if(n >0) {
return x*myPow(x,n-1);
}else if(n<0) {
return 1/(x*myPow(x,-n-1));
}
return x;
}
然后栈溢出了- -!那么在n<0的时候和n>0的时候进行优化,又因为n<0就是加下分母1,即1/n>0 ,并且在大于0的时候 若为2的整次数则 进行优化为 myPow(x*x, n/2);
故优化后如下:
public double myPow(double x, int n) {
double res =0;
if(n ==0) {
res =1 ;
}else if(n<0) {
res= 1/myPow(x,-n);
}else if(n >0) {
if(n%2 == 0){
return myPow(x*x, n/2);
} else{
return x * myPow(x, n-1);
}
}
return res;
}
但最小负数−2^31比最大正数 2^31 − 1少1
故当n为-2^31的时候
if(n ==Integer.MIN_VALUE){
return 1 / (myPow(x, -n -1) * x);
}
所以最终结果为
public double myPow(double x, int n) {
double res = 0;
if (n == 0) {
res = 1;
} else if (n < 0) {
if(n ==Integer.MIN_VALUE){
return 1 / (myPow(x, -n -1) * x);
}
res = 1 / myPow(x, -n);
} else if (n > 0) {
if (n % 2 == 0) {
return myPow(x * x, n / 2);
} else {
return x * myPow(x, n - 1);
}
}
return res;
}