如何用递归实现判断y是否为x的幂并返回对应指数?
递归实现判断y是否为x的幂并返回指数
原代码的问题分析
你的当前代码逻辑完全偏离了递归解法的核心思路:
- 递归调用时传递的
solution(pow, y - 1)毫无意义,既没有逐步缩小问题规模,也没有正确累积指数计数 x == 1时返回布尔值(y == 1),不符合题目要求的数字返回格式(应返回0或-1)- 循环的使用和递归设计冲突,递归解法不需要预计算幂值来推进逻辑
关于取模运算符的使用
取模运算符%确实是这个问题的关键辅助工具:当y不能被x整除时,说明y绝对不可能是x的幂,此时可以直接返回-1终止递归。
正确的递归解法思路
递归的核心是逐步缩小问题规模,同时累积指数计数:
- 边界条件处理:
- 如果
x === 1:只有当y === 1时返回0(因为1^0 = 1,且1的任何次幂都是1,若y≠1则返回-1) - 如果
y === 1:返回0(任何数的0次幂都是1,这是递归的终止点之一) - 如果
y % x !== 0:返回-1(无法被x整除,直接排除)
- 如果
- 递归逻辑:
将y除以x,递归调用函数处理新的y,如果递归结果不为-1,则返回结果+1(累积指数);若递归结果为-1,直接返回-1。
修正后的代码
function solution(x, y) { // 处理x=1的特殊情况 if (x === 1) { return y === 1 ? 0 : -1; } // 终止条件:y等于1,说明已经除到x的0次幂 if (y === 1) { return 0; } // 如果y不能被x整除,直接返回-1 if (y % x !== 0) { return -1; } // 递归调用,将y缩小为y/x,指数加1 const result = solution(x, y / x); return result === -1 ? -1 : result + 1; } console.log(solution(3, 9)); // 输出2,符合预期 console.log(solution(2, 8)); // 输出3 console.log(solution(5, 25)); // 输出2 console.log(solution(2, 7)); // 输出-1 console.log(solution(1, 1)); // 输出0 console.log(solution(1, 5)); // 输出-1
代码解释
以solution(3,9)为例:
- 第一次递归:
9%3===0,调用solution(3,3) - 第二次递归:
3%3===0,调用solution(3,1) - 第三次递归:
y===1,返回0 - 回溯时,第二次递归返回
0+1=1,第一次递归返回1+1=2,得到最终结果
内容的提问来源于stack exchange,提问作者Sharon Kaufman
相关产品推荐
相关产品推荐

