在力扣上刷到了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)
时,会按照以下步骤进行递归计算:
- 初始调用
myPow(2, 4)
,其中N = 4
是正整数。 - 根据
N
的正负性,调用 helppow(2, 4)
。 - 在 helppow的第一层递归中,
N = 4
是偶数,计算y =
helppow(2, 2)
。 - 在 helppow 的第二层递归中,
N = 2
仍然是偶数,计算y =
helppow(2, 1)
。 - 在 helppow的第三层递归中,
N = 1
是奇数,计算y =
helppow(2, 0)
。 - 在 helppow的第四层递归中,
N = 0
,满足终止条件,直接返回 1.0。 - 返回至第三层递归,将
y
的值乘以x
,得到y = y * y * x = 1 * 2 = 2
。 - 返回至第二层递归,这时因为 第二层的n是偶数 将
y
的值乘以 y,得到y = y * y = 2 * 2 = 4
。 - 返回至第一层递归,将
y
的值乘以x
,得到y = y * y = 4 * 4 = 16
。 - 最终返回
y
的值 16,即myPow(2, 4)
的结果。
递归的层数取决于输入的指数 N
的大小。每一层递归,指数 N
都会减半,直到达到递归终止条件 N == 0
。因此,递归的层数为 log2(N)
(以 2 为底的对数)。请注意,这个值是向下取整的。
具体来说,如果指数 N
的值非常大,那么递归的层数也会相应增加。而如果指数 N
的值较小,递归的层数也会相应减少。这是由于每次递归,指数 N
都会减半,因此递归的层数与指数 N
之间存在对数关系。
需要注意的是,递归的层数并不是指实际的函数调用次数,而是指递归的深度。在每一层递归中,会有两个子问题(除了终止条件),因此函数调用的总次数是指数级的。但是由于快速幂算法的特性,函数的实际执行时间是以对数级增长的,而不是指数级增长的。
总结起来,递归的层数为 log2(N)
,其中 N
是输入的指数值。