Kotlin递归质因数分解函数执行return后未退出递归的问题排查
问题排查与修正方案
先拆解你这段代码里的几个致命问题,正是它们导致了无限递归和逻辑混乱:
1. 未定义的answer与可变状态陷阱
你直接在函数里使用了answer,但既没有在函数内声明它,也没有作为参数传递。就算它是全局变量,递归过程中所有调用都会共享这个变量,结果会混乱不堪——比如多次调用factors时,之前的结果会残留下来,完全不符合预期。
2. 递归调用未处理返回值,且触发无限递归
找到能整除l的i后,你调用了factors(l/i),但完全没有把这个递归调用的结果和当前的i拼接起来,相当于白执行了这段递归。更糟的是,循环结束后你又执行了return factors(l)——这意味着不管有没有找到因数,函数都会再次以同一个l值调用自己,直接陷入无限递归,永远不会触发l == 1的终止条件。
3. 找到因数后未终止循环
当你找到第一个能整除l的i(也就是最小质因数)后,应该立刻终止循环,不然会继续遍历更大的数,重复处理同一个l,浪费资源还可能引入错误。
修正后的递归实现
我们需要把结果状态通过参数传递(避免全局变量),同时正确处理递归返回值,找到因数后终止循环并返回拼接后的结果:
fun factors(l: Int, currentResult: String = ""): String { return if (l == 1) { // 去掉末尾多余的空格,返回干净的最终结果 currentResult.trim() } else { // 遍历寻找当前l的最小质因数 for (i in 2..l) { if (l % i == 0) { // 拼接当前因数,递归处理l除以i后的新值 return factors(l / i, "$currentResult$i ") } } // 理论上不会走到这里,因为l>=2时至少能被自身整除 currentResult } }
调用示例:
fun main() { println(factors(12)) // 输出 "2 2 3" println(factors(17)) // 输出 "17" println(factors(1)) // 输出 "" }
关键改进点:
- 使用默认参数
currentResult传递当前拼接的质因数字符串,避免全局变量的状态污染 - 找到最小质因数后,立刻递归调用
factors(l/i)并返回结果,终止循环和当前函数执行 - 当
l == 1时,修剪掉结果末尾的空格,返回符合预期的干净字符串 - 移除了原代码中导致无限递归的
return factors(l)语句
内容的提问来源于stack exchange,提问作者Khabi
相关产品推荐
相关产品推荐

