算法练习第46题-Pow(x, n)

202 阅读2分钟

一、题目

实现 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)

四、测试结果

递归测试结果

image.png

迭代测试结果

image.png