一、题目
实现 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
作者:力扣 (LeetCode) 链接:leetcode.cn/leetbook/re… 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
二、思路
递归处理
- 思考三种情况
- 第一种情况n < 0
- 当n 小于 0时,分子不变为1,分母不断的增大
- 当n 等于 0时,值为1,该情况是递归的边界,当n等于0时,递归就结束了
- 当n 大于0时,值依然分为两种情况,
- 第一种是能被2整除,第二种是不能被2整除
- 如果能被2整除,依然递归处理,不能被2 整除,特殊处理
- 举例如果x = 2, n = -10
- 在分子确定的情况下,不管分子,处理分母,
- n不能被2整除,那么它的计算过程是2 -> 2^2 -> 2^4*2 -> 2^10
- 假设n为16的话,那么计算过程就是2 -> 2^2 -> 2^4 -> 2^8 -> 2^16
- 因此要特别的判断当前n是否能被整除,如果不能,那么就额外的乘以x
迭代处理
- 首先判断当前n为整数还是负数
- 之后根据之前的判断,如果n为能被2整除,那么就叠乘就行了
- n不能被2整除,那么它的计算过程是2 -> 2^2 -> (2^2)*(2^2)2 -> (2^5)(2^5)
- 假设n为16的话,那么计算过程就是2 -> 2^2 -> (2^2)(2^2) -> (2^4)(2^4) -> (2^8)*(2^8)
- 那么可以使用while,依次从高到低处理,如果除2有余数,就多乘一次当前值
三、代码
递归思路
const myPow = function(x, n) {
/**
* 思考三种情况
* 第一种情况n < 0
* 当n 小于 0时,分子不变为1,分母不断的增大
* 当n 等于 0时,值为1,该情况是递归的边界,当n等于0时,递归就结束了
* 当n 大于0时,值依然分为两种情况,
* 第一种是能被2整除,第二种是不能被2整除
* 如果能被2整除,依然递归处理,不能被2 整除,特殊处理
*
* 这里举例-10
* 如果x = 2, n = -10
* 在分子确定的情况下,不管分子,处理分母,
* n不能被2整除,那么它的计算过程是2^0 -> 2^2 -> 2^4*2 -> 2^10
* 假设n为16的话,那么计算过程就是2^0 -> 2^2 -> 2^4 -> 2^8 -> 2^16
* 因此要特别的判断当前n是否能被整除,如果不能,那么就额外的乘以x,
* */
if (n < 0) return 1/myPow(x,-n)
if (n == 0) return 1
return n % 2 == 0 ?myPow(x * x, n/2):myPow(x * x,Math.floor(n/2))*x
}
迭代思路
let x = 2, n = 4
const myPow = function(x, n) {
/**
* 思路
* 首先判断当前n为整数还是负数
* 之后根据之前的判断,如果n为能被2整除,那么就叠乘就行了
* n不能被2整除,那么它的计算过程是2 -> 2^2 -> (2^2)*(2^2)*2 -> (2^5)*(2^5)
* 假设n为16的话,那么计算过程就是2 -> 2^2 -> (2^2)*(2^2) -> (2^4)*(2^4) -> (2^8)*(2^8)
* 那么可以使用while,依次从高到低处理,如果除2有余数,就多乘一次当前值
* */
return n >= 0 ? quickMul(n,x):1.0 / quickMul(-n,x)
}
const quickMul = (n,x) => {
let ans = 1.0, data = x
while (n > 0) {
if (n % 2 == 1) ans *= data
data *= data
n = Math.floor(n/2)
}
return ans
}
myPow(x, n)