幂函数递归实现输出错误:调用power2(4,3)预期64实际不符
问题分析与修复
你的递归幂函数结果不符合预期,核心原因是快速幂算法针对整数次幂设计,但代码中直接用n/2会得到浮点数,导致递归逻辑偏离了整数次幂的计算路径。
以power2(4,3)的执行流程为例:
- 首次调用时
n=3,n/2=1.5,递归进入power2(4,1.5) - 在
power2(4,1.5)中,n%2=1.5不等于1,因此返回temp*temp,而temp是power2(4,0.75)的结果 - 后续递归参数持续变为更小的浮点数,所有分支都走
temp*temp,最终计算逻辑完全偏离了整数次幂的正确分解,导致结果错误。
修复后的代码
将n/2替换为整数除法(向下取整),确保递归参数始终是整数:
let power2 = (x,n) => { if(n == 0) return 1; // 用Math.floor实现整数除法,保证递归参数为整数 let temp = power2(x, Math.floor(n/2)); if(n%2 == 1) return temp * temp * x; return temp*temp; } console.log(power2(4,3)); // 输出64
如果仅针对正整数次幂的场景,也可以用ES6的整数除法运算符//简化代码:
let power2 = (x,n) => { if(n == 0) return 1; let temp = power2(x, n//2); if(n%2 == 1) return temp * temp * x; return temp*temp; }
修复逻辑说明
快速幂的核心是把整数次幂分解为:
- 当n为偶数时:
x^n = (x^(n/2))² - 当n为奇数时:
x^n = (x^(n//2))² * x
这里的n//2必须是整数除法,才能保证每一步递归都在计算整数次幂,从而得到正确的结果。
内容的提问来源于stack exchange,提问作者Venkata Sai Teja
相关产品推荐
相关产品推荐

