力扣题解Pow(x,n)

在力扣上刷到了Pow(x,n)这道题,就简单的使用暴力解出来,给的测试用例能过,但是肯定是超时的

 double myPow(double x, int n) {

        double result =1;

        if(n==0){

            return 1;

        }

        else if(n>0){

            for(int i =0;i<n;i++){

                result*=x;

            }

            return result;

        }

        else{

           

             for(int i =0;i<(n*-1);i++){

                result*=x;

            }

            return 1/result;

        }

接下来 将给大家详细解释下面这个解法

 double helppow(double x, int n){

        if(n==0){

            return 1;

        }

        double y = helppow(x,n/2);

        return n%2==0?y*y:y*y*x;

    }

    double myPow(double x, int n) {

       

       return n>=0?helppow(x,n):1.0/helppow(x,n);

    }

当调用 myPow(2, 4) 时,会按照以下步骤进行递归计算:

  1. 初始调用 myPow(2, 4),其中 N = 4 是正整数。
  2. 根据 N 的正负性,调用 helppow(2, 4)
  3. 在 helppow的第一层递归中,N = 4 是偶数,计算 y = helppow(2, 2)
  4. 在 helppow 的第二层递归中,N = 2 仍然是偶数,计算 y = helppow(2, 1)
  5. 在 helppow的第三层递归中,N = 1 是奇数,计算 y = helppow(2, 0)
  6. 在 helppow的第四层递归中,N = 0,满足终止条件,直接返回 1.0。
  7. 返回至第三层递归,将 y 的值乘以 x,得到 y = y * y * x = 1 * 2 = 2
  8. 返回至第二层递归,这时因为 第二层的n是偶数 将 y 的值乘以 y,得到 y = y * y = 2 * 2 = 4
  9. 返回至第一层递归,将 y 的值乘以 x,得到 y = y * y = 4 * 4 = 16
  10. 最终返回 y 的值 16,即 myPow(2, 4) 的结果。

递归的层数取决于输入的指数 N 的大小。每一层递归,指数 N 都会减半,直到达到递归终止条件 N == 0。因此,递归的层数为 log2(N)(以 2 为底的对数)。请注意,这个值是向下取整的。

具体来说,如果指数 N 的值非常大,那么递归的层数也会相应增加。而如果指数 N 的值较小,递归的层数也会相应减少。这是由于每次递归,指数 N 都会减半,因此递归的层数与指数 N 之间存在对数关系。

需要注意的是,递归的层数并不是指实际的函数调用次数,而是指递归的深度。在每一层递归中,会有两个子问题(除了终止条件),因此函数调用的总次数是指数级的。但是由于快速幂算法的特性,函数的实际执行时间是以对数级增长的,而不是指数级增长的。

总结起来,递归的层数为 log2(N),其中 N 是输入的指数值。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值