题目描述 - Pow(x, n)
实现 pow(x, n) ,即计算 x
的整数 n
次幂函数(即,x^n
)。
示例:
- 输入:
x = 2.00000, n = 10
,输出:1024.00000
- 输入:
x = 2.10000, n = 3
,输出:9.26100
- 输入:
x = 2.00000, n = -2
,输出:0.25000
思路分析
Pow(x, n),即求输入数字x
的 n
次幂。最直接的方案是用循环将num自乘,乘power次,则时间复杂度是O(n),x * power(x, n-1)
, 这样的解法并不能通过力扣编译,会报错:Maximum call stack size exceeded
, 初步猜测是形成了闭包造成堆栈溢出。
再次分析,我们可以利用分治递归思路解决此问题。当n是偶数的时候,对n进行分治,拆解为x*x
的n/2
的次方,当n为奇数的时候拆分成x * myPow(x,n-1)
,这里需要特别注意的是当n为负数或者是0的特殊情况。
代码实现:
/**
* @param {number} x
* @param {number} n
* @return {number}
*/
var myPow = function(x, n) {
// 处理 n 为 0 的情况
if(n===0)return 1
// 处理 n 为 负数 的情况
if(n<0){
return 1 / myPow(x, -n)
}
// n 为奇数
if(n % 2){
return x * myPow(x, n - 1)
}
return myPow(x*x, n/2)
};
除了分治递归的方法外, 我们也可以通过迭代实现上述结果:
/**
* @param {number} x
* @param {number} n
* @return {number}
*/
var myPow = function(x, n) {
if(n===0)return 1
if(n<0){
return 1 / myPow(x, -n)
}
if(n === 1) return x
let res = 1
while(n >=1){
if(n % 2){
res = res * x
n--
}
x = x * x
n = n/2
}
return res
};
相对于递归算法,迭代的方法可能不太好理解,具体运行流程如下面例子:
myPow(2,5) 求 2 的 5 次幂
x = 2,n = 5; n % 2 == 1, res = 2 * 1; => res = 2; n=4
x = 2,n = 4; n % 2 == 0, x = 2 * 2; => x = 4 ; n = n/2 = 2
x = 2, n = 2; n % 2 == 0, x = 4 * 2; => x = 8 ; n = n/2 = 1
x = 2, n = 1; n % 2 == 1, res = 2 * 8; n-- => res = 16 ; n=0
x = 2, n = 1; 跳出循环 得到结果