//首先想到的就是逐次递归
class Solution {
public double myPow(double x, int n) {
if(n==0){
return 1;
}
if(n<0){
return 1.0/myPow(x, -n);
}
return myPow(x,n-1)*x;
}
}
//但是在最后的return那里报java.lang.StackOverflowError,马上想到是递归次数太多,采用二分法降低递归次数
class Solution {
public double myPow(double x, int n) {
if(n==0){
return 1;
}
if(n<0){
return 1.0/myPow(x, -n);
}
double tmp = myPow(x, n>>1);
tmp = tmp*tmp;
if(n%2==1)tmp *= x;
return tmp;
}
}
//这次在n<0分支里面报java.lang.StackOverflowError,错误点是1.00000 -2147483648,原来是没判1
class Solution {
public double myPow(double x, int n) {
if(n==0 || x==1){
return 1;
}
if(n<0){
return 1.0/myPow(x, -n);
}
double tmp = myPow(x, n>>1);
tmp = tmp*tmp;
if(n%2==1)tmp *= x;
return tmp;
}
}
//结果还是在n<0分支里面报java.lang.StackOverflowError,错误点是2.00000 -2147483648
//仔细一看只可能是-2147483648出问题,可能是int类型加负号后值不变,然后死循环。搞了很久,无解
//看题解原来是用一个while代替递归。。。行吧
class Solution {
public double myPow(double x, int n) {
if(x == 0) return 0;
long b = n;
double res = 1.0;
if(b < 0) {
x = 1 / x;
b = -b;
}
while(b > 0) {
if((b & 1) == 1) res *= x;
x *= x;
b >>= 1;
}
return res;
}
}
看起来递归在面对大规模问题的时候往往会有失控的风险,这时候可以考虑使用while循环或者动态规划