Ruby递归实现质因数分解代码输出异常与优化问题咨询
问题排查与优化建议
核心逻辑问题定位
- 数组拼接逻辑错误:递归调用
get_prime_factors返回的是数组类型,你直接用<<将其插入factors数组,会把整个返回数组作为单个嵌套元素插入,最终得到多层嵌套的数组结构,而非平铺的质因数列表。比如输入12时,原代码输出为[2, [2, [3]]],不符合预期的[2,2,3]。 - 基线条件设计冗余:返回
nil属于类型不统一的设计,所有递归分支的返回值应该保持同类型(这里统一为数组),既符合语义也不需要后续额外删除nil。 - 冗余的质数判断:遍历从2开始递增,第一个能整除目标数的
k必然是质数(如果k是合数,它的质因数一定小于k,早已在之前的遍历中完成整除判断),所以prime?的调用完全可以省略,减少性能损耗。
优化实现步骤
- 修改基线条件:将
return nil if num <=1改为return [] if num <=1,空数组刚好对应「小于等于1的数没有质因数」的语义,也和递归分支返回数组的类型保持统一。 - 替换数组拼接方式:将
factors << get_prime_factors(num / k)改为factors += get_prime_factors(num / k),+=会把返回数组的元素逐个追加到当前factors数组中,不会产生嵌套结构。 - 移除冗余的
prime?判断,简化逻辑。
优化后完整代码
def get_prime_factors(num) return [] if num <= 1 factors = [] (2..num).each do |k| if num % k == 0 factors << k factors += get_prime_factors(num / k) break end end factors end
递归处理数组返回值的通用思路
- 保持所有分支返回值类型统一,不要出现部分分支返回数组、部分分支返回
nil/数值的情况,避免后续处理逻辑冗余。 - 拼接递归返回的数组时,使用数组追加方法(
+=/concat)而非单元素插入方法(<<),避免产生嵌套结构。
内容的提问来源于stack exchange,提问作者KGE
相关产品推荐
相关产品推荐

