1.题目链接:
2.题目描述:
实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,x^n )。
示例 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
提示:
-100.0 < x < 100.0
-2^31 <= n <= 2^31-1
n 是一个整数
要么 x 不为零,要么 n > 0 。
-10^4 <= x^n <= 10^4
3. 解法(递归 - 快速幂):
算法思路:
1. 递归函数的含义:求出 x 的 n 次方是多少,然后返回;
2. 函数体:先求出 x 的 n / 2 次方是多少,然后根据 n 的奇偶,得出 x 的 n 次方是多少;
3. 递归出口:当 n 为 0 的时候,返回 1 即可。
Java算法代码:
class Solution {
public double myPow(double x, int n) {
return n<0 ? 1.0 /pow(x,-n) : pow(x,n);
}
public double pow(double x, int n) {
if(n==0) return 1.0;
double tmp = pow(x,n/2);
return n%2==0 ? tmp*tmp : tmp*tmp*x;
}
}
运行结果:

递归展开:笔者认为这里没有必要,读者可以自行展开。
笔者想来谈谈为什么会想到递归:
比如计算 3^7:
这个时候,如果直接展开:3*3*3*3*3*3*3(也就是我们说的七个三相乘)
求3^7次方:3*(3^3)*(3^3)
继续同样的:3*[3*(3^1*3^1)]*[3*(3^1*3^1)]
现在看来,则如果表达式写开,和我们说的7个3相乘好像是一样的。
这里的每一步,都会先判断数的幂是奇数还是偶数。偶数就拆开,奇数先拿出去一个然后拆开。
3^7=3*(3^6)=3*(3^3)*(3^3)=3*[3*(3^1)]*[3*(3^1)]
通过这样拆分,我们发现计算3^7,只需要知道3和3^6,然后不断拆解,最终发现只需要知道3^1,就可以完成这个事情。
还是给展开下吧。

注意一个细节,上面笔者说只要展开到它自己就ok了。
如果x=0.44528,n=0 呢?就会有问题,所以可以再找一个更下面的。
毕竟3^1,可以再带入递归函数,让函数通过n=0来作为出口。
所以从前面说的来看,出口有两个,但是作者这里使用了一个,没有另一个也是有原因的。
逻辑展开:记住,逻辑展开非常重要,是用来帮助你来接收这种思想的,你不可能所有情况下都展开,逻辑展开就是来让你相信,你的递归函数一定能做到要做的事。

---------------------------------------------------------------------------------------------------------------------------------
记住,相信你的递归函数,它可以做到!
记住,不理解时候,去尝试手动展开!
记住,逻辑展开(你不可能对所有的题目都进行手动展开)!
-快速幂(medium)&spm=1001.2101.3001.5002&articleId=147859048&d=1&t=3&u=b4ed39c070564c9baa338b9b480c27fd)
522

被折叠的 条评论
为什么被折叠?



