题目描述
实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。
输入输出
1 | 输入:x = 2.00000, n = 10 |
基本思路
快速幂与递归 时复O(logn)空复O(logn) 由递归层数决定
- 分治算法 拆分成举例计算$x^{64}$ 则计算$x \rightarrow x^{2} \rightarrow x^{4} \rightarrow x^{8} \rightarrow x^{16} \rightarrow x^{32} \rightarrow x^{64}$ 从
x
开始,每次直接把上一次的结果进行平方,计算 66 次就可以得到 $x^{64}$ 的值 而不需要对x
乘以63次x
- 计算 $x^n$ 时我们可以先递归计算 $x^{n/2}$ 根据递归计算的结果 如果n为偶数那么 $x^n = y^2$ 如果n为奇数那么$x^n = y^2 \times x$
- 递归的边界为
n=0
任意数的0次方均为1
- 分治算法 拆分成举例计算$x^{64}$ 则计算$x \rightarrow x^{2} \rightarrow x^{4} \rightarrow x^{8} \rightarrow x^{16} \rightarrow x^{32} \rightarrow x^{64}$ 从
快速幂与迭代 时复O(logn)空复O(1)
- 举例 $x^{11} = x^{2^{3}} \times x^{2^{1}} \times x^{2^{0}}$ 此时只运行了三次乘积 时间复杂度为O(logn)
(b & 1) == 1
判断最后一位是否为1 最终结果就是将每一位1所对应的权重相乘即可
java实现
1 | // 快速幂+递归 |