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

Java质因数列表生成返回多结果问题求助

你的质因数分解程序问题分析与修复方案

嘿,刚接触编程和Stack Overflow的话别担心,这个问题其实挺常见的,咱们一步步来理清楚~

核心问题所在

你把primelist定义成了类的成员变量,这就意味着每次调用findPrime方法时,这个列表不会自动清空,而是会把新的因数继续追加到之前的结果里。比如第一次调用得到[2,5],第二次调用时列表已经保留了这两个元素,再添加新的因数就会出现重复或多余的内容,也就是你看到的[2,5,5]。

另外从代码片段的逻辑来看,你应该是打算递归处理分解后的剩余数字,但成员变量的列表会在递归过程中不断累加,导致结果混乱。

修复后的代码示例

把列表改成方法内的局部变量,并调整递归逻辑,就能解决问题:

public class Solution {
    ArrayList<Integer> findPrime(int num) {
        // 把列表定义为方法局部变量,每次调用都会新建空列表
        ArrayList<Integer> primelist = new ArrayList<>();
        for (int i = 2; i <= num; i++) {
            if (num % i == 0) {
                primelist.add(i);
                // 递归处理分解后的剩余数字,并合并结果
                primelist.addAll(findPrime(num / i));
                // 找到最小质因数后跳出循环,避免重复遍历
                break;
            }
        }
        return primelist;
    }
}

关键修正点解释

  • 局部变量替代成员变量:每次调用findPrime都会创建全新的空列表,彻底避免了之前调用的结果残留。
  • 添加break语句:找到能整除当前num的最小i(也就是质因数)后,立刻跳出循环,因为我们只需要分解这个质因数,剩下的交给递归处理,否则会继续遍历更大的i,导致重复添加无关因数。
  • 递归结果合并:用addAll把递归返回的子质因数列表合并到当前列表,保证最终返回的是完整的质因数分解结果。

测试验证

调用findPrime(10)时:

  1. 第一次循环i=2,10%2==0,添加2到列表,然后递归调用findPrime(5)。
  2. 在递归调用中,i遍历到5时,5%5==0,添加5到列表,返回[5]。
  3. 原方法把[5]合并到当前列表,得到[2,5]并返回,结果正确。

内容的提问来源于stack exchange,提问作者mendokusai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:31:56