You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby递归实现质因数分解代码输出异常与优化问题咨询

问题排查与优化建议

核心逻辑问题定位

  • 数组拼接逻辑错误:递归调用get_prime_factors返回的是数组类型,你直接用<<将其插入factors数组,会把整个返回数组作为单个嵌套元素插入,最终得到多层嵌套的数组结构,而非平铺的质因数列表。比如输入12时,原代码输出为[2, [2, [3]]],不符合预期的[2,2,3]。
  • 基线条件设计冗余:返回nil属于类型不统一的设计,所有递归分支的返回值应该保持同类型(这里统一为数组),既符合语义也不需要后续额外删除nil。
  • 冗余的质数判断:遍历从2开始递增,第一个能整除目标数的k必然是质数(如果k是合数,它的质因数一定小于k,早已在之前的遍历中完成整除判断),所以prime?的调用完全可以省略,减少性能损耗。

优化实现步骤

  1. 修改基线条件:将return nil if num <=1改为return [] if num <=1,空数组刚好对应「小于等于1的数没有质因数」的语义,也和递归分支返回数组的类型保持统一。
  2. 替换数组拼接方式:将factors << get_prime_factors(num / k)改为factors += get_prime_factors(num / k),+=会把返回数组的元素逐个追加到当前factors数组中,不会产生嵌套结构。
  3. 移除冗余的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 10:15:02