50,实现 pow(x, n)
题目描述
实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,x^n )。
示例
输入:x = 2.00000, n = 10
输出:1024.00000
输入:x = 2.10000, n = 3
输出:9.26100
题解
思路:
快速幂的实现:
由于n可能为正数或者n可能为负数,对于负数可以进行取反,所以可以只考虑n为正数的时候.
有两种方式
- 1,使用递归的方式
- 2,使用迭代的方式
代码:
1,递归的方式,
简单理解就是分而治之
从n->n/2向下递归
同时根据n的奇偶来决定是y * y 还是 y * y * x
var myPow = function(x, n) {
let temp = n < 0 ? true : false
n = Math.abs(n)
return temp ? 1 / dfs(x, n) : dfs(x, n)
function dfs(x,n){
if(n == 0){
return 1
}
let y = dfs(x, Math.floor(n / 2))
return n % 2 == 0 ? y * y : y * y * x
}
};
2,使用迭代的方式
和递归方式相反
是从1 - n 进行迭代
需要我们思考的是,怎么去标记指数的变化
直接记住指数的规律:
对于n的二进制编码中的每一个1,记为i1,i2,…
最后的结果是 res = x^i1 * x^i2 * …
举例子:
对于mypow(2, 10)
10(00001010)
每一个1:00000010,00001000
res = 2^(00000010) * 2^(00001000)
var myPow = function(x, n){
// 对n为负数的时候进行处理
let temp = n < 0 ? true : false, res = 1
n = Math.abs(n)
while(n){
// 当最后一位为1的时候,就将得到的x和结果相乘
if(n & 1) res = res * x
// 记录迭代中x的值
x = x * x
// 将n进行无符号右移,目的就是记录n中每一个1的情况,x就对应着
n = n >>> 1
}
return temp ? 1 / res : res
}