5.Pox(x,n)-快速幂(medium)

1.题目链接:

50. Pow(x, n) - 力扣(LeetCode)50. Pow(x, n) - 实现 pow(x, n) [https://www.cplusplus.com/reference/valarray/pow/] ,即计算 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 提示: * -100.0 < x < 100.0 * -231 <= n <= 231-1 * n 是一个整数 * 要么 x 不为零,要么 n > 0 。 * -104 <= xn <= 104https://leetcode.cn/problems/powx-n/submissions/628862358/

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来作为出口。

所以从前面说的来看,出口有两个,但是作者这里使用了一个,没有另一个也是有原因的。

逻辑展开:记住,逻辑展开非常重要,是用来帮助你来接收这种思想的,你不可能所有情况下都展开,逻辑展开就是来让你相信,你的递归函数一定能做到要做的事。

---------------------------------------------------------------------------------------------------------------------------------

记住,相信你的递归函数,它可以做到!

记住,不理解时候,去尝试手动展开!

记住,逻辑展开(你不可能对所有的题目都进行手动展开)!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值