力扣第50题 Pow(x,n) c++ 快速幂 + 递归

题目

50. Pow(x, n)

中等

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

提示:

  • -100.0 < x < 100.0
  • -231 <= n <= 231-1
  • n 是一个整数
  • 要么 x 不为零,要么 n > 0 。
  • -104 <= xn <= 104

思路和解题方法

  1. 定义了一个名为myPow的函数,它接受两个参数:底数x和指数n
  2. 将指数n转换为long long类型的变量N,以处理负数指数的情况。
  3. 如果指数N大于等于零,则调用递归函数fun(x, N)来计算结果;否则,计算1.0除以递归函数fun(x, -N)的结果,以处理负数指数的情况。
  4. 定义了一个名为fun的递归函数,它接受两个参数:底数x和指数n
  5. 如果指数n等于零,则返回1作为递归终止条件。
  6. 如果指数n等于1,则返回底数x作为递归终止条件。
  7. 否则,计算一半指数的递归结果t = fun(x, n / 2)
  8. 如果指数n为偶数(即n % 2 == 0),则返回t的平方y * y作为结果。
  9. 如果指数n为奇数,则返回t的平方乘以底数x的结果y * y * x作为结果。

复杂度

        时间复杂度:

                O(log n)

时间复杂度为O(logN),其中N是指数的绝对值。这是因为在每个递归步骤中,指数被除以2,因此需要logN步才能将指数减少到0或1。而在每个递归步骤中,只需要进行一次乘法运算,所以总的计算复杂度是O(logN)。

        空间复杂度

                O(log n)

空间复杂度为O(logN),这是由于在每个递归步骤中,需要使用栈空间来保存递归调用的上下文,因此递归深度最多为logN,从而占用O(logN)的空间。

c++ 代码

 ​
class Solution {
public:
    double myPow(double x, int n) {
        long long N=n; // 将指数 n 转换为 long long 类型的变量 N,以处理负数指数的情况
        return N>=0?fun(x,N):1.0/fun(x,-N); // 如果指数 N 大于等于零,则调用 fun(x, N) 计算结果;否则,计算 1.0 除以 fun(x, -N) 的结果
    }
    
    double fun(double x, int n) {
        if (n == 0) return 1; // 指数为 0,返回 1 作为递归终止条件
        if (n == 1) return x; // 指数为 1,返回底数 x 作为递归终止条件
        
        double y = fun(x, n / 2); // 递归计算一半指数的结果 y
        
        // 如果指数为偶数,则返回 y 的平方;如果指数为奇数,则返回 y 的平方乘以底数 x
        return n % 2 == 0 ? y * y : y * y * x;
    }
};

总结收获

        快速幂是一种高效计算幂函数的方法,它利用了指数的二进制表示形式。递归在这里用于将问题拆分成更小的子问题。

首先解释一下快速幂的思想:假设要计算 x 的 n 次幂,可以通过以下步骤进行计算:

  1. 初始化结果 res 为 1。
  2. 将指数 n 转换为二进制表示形式,例如将 11 转换为二进制为 1011。
  3. 从二进制的最右边开始,依次遍历每一位:
    • 如果当前位为 1,则将结果 res 乘以底数 x。
    • 将底数 x 自乘,即 x = x * x,表示底数每次自乘一次。
  4. 继续遍历下一位,直到遍历完成(即指数的所有位都处理完毕)。
  5. 返回最终的结果 res。

而递归在快速幂算法中的作用是将问题不断拆分成更小的子问题。在代码中,fun 函数用递归的方式计算幂函数。

  1. 首先判断递归的终止条件:
    • 如果指数 n 等于 0,说明任何数的 0 次幂都等于 1,所以返回 1。
    • 如果指数 n 等于 1,说明任何数的 1 次幂都等于它本身,所以返回底数 x
  2. 如果指数 n 大于 1,通过递归调用 fun 函数计算底数 x 的一半指数的结果 y = fun(x, n / 2)。这里通过将指数除以 2,将问题的规模减小一半。
  3. 然后根据指数的奇偶性进行判断:
    • 如果指数 n 是偶数,即 n % 2 == 0,则返回 y 的平方 y * y,因为 x^n = (x^(n/2))^2
    • 如果指数 n 是奇数,则返回 y 的平方乘以底数 x 的结果 y * y * x,因为 x^n = (x^(n/2))^2 * x
  4. 最终递归结束时会得到结果。

        通过递归和快速幂的思想,可以将幂函数的计算复杂度从线性降低到对数级别,提高计算效率。

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值