将 n 次相乘的幂运算转化为 log2N 次平方运算,并且采用递归算法
原书给出的最优算法本身不处理负数,是外层函数处理的
double myPow(double x, int n) {
double res = pow(x, abs(n));
if (n < 0)res = 1 / res;
return res;
}
double pow(double x, int n) {
if (n == 0)return 1;// 不管是奇数还是偶数,最终移位运算会得到0,也就是n最终=0
// 这里我们是用移位运算替代了/2运算
// if (n == 1)return x;
double res = myPow(x, n >> 1);// 自顶向下分解为 log2n 次平方操作
res *= res;// 自底向上平方 log2n次
// 比如3和2都是右移1次变成1,两次变成0,所以最后对于奇数次的情况需要补一次,同时也是最外层的底数本身
if (n & 1)res *= x;
return res;
}
标签:myPow,平方,return,运算,Offer,res,16,double,次方
From: https://www.cnblogs.com/yaocy/p/17637647.html