剑指 Offer 16. 数值的整数次方
实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。
示例 1:
输入: x = 2.00000, n = 10
输出: 1024.00000
示例 2:
输入: x = 2.10000, n = 3
输出: 9.26100
示例 3:
输入: x = 2.00000, n = -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25
提示:
-100.0 < x < 100.0-231 <= n <= 231-1-104 <= xn <= 104
思路1: 快速幂 www.cnblogs.com/wuguanglin/…
javascript:
var myPow = function(x, n) {
let res = 1.0
let abn = n < 0 ? -n : n;
while (abn > 0) {
if (abn & 1) {
res *= x;
}
x *= x;
//进行无符号右移1位,此处不能使用有符号右移(>>)
abn >>>= 1;
}
return n > 0 ? res : 1/res;
};
思路2: 递归
使用递归的方法: n=0时,任何x都返回1 n=1时,返回x n=-1时,返回1/x
对于其他n值: 当n为偶数时,myPow(x,n) = myPow(x,n/2)* myPow(x,n/2) 当n为奇数时:myPow(x,n) = myPow(x,(n-1)/2) * myPow(x,(n-1)/2) * x 注意:递归时先用一个变量取得myPow(x,n/2)的值再平方,可以降低时间复杂度(减少递归调用的次数)
typescript:
function myPow(x: number, n: number): number {
if (n === 0) return 1;
if (n === 1) return x;
if (n === -1) return 1 / x;
if (n % 2 === 0) {
let a = myPow(x, n / 2);
return a * a;
} else {
let b = myPow(x, (n - 1) / 2);
return b*b*x;
}
};