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

Java中prime方法为何会无限递归?求解决办法

问题分析与解决

无限递归的原因

你的prime方法最后一行写了return prime(x);,这会导致每次调用该方法时,完成质数判断逻辑后无条件再次调用自身,完全没有终止递归的条件,最终触发无限递归错误。

为什么复制到main里能正常运行

把判断逻辑复制到main方法时,你只执行了判断和打印操作,没有添加递归调用的代码,自然不会触发递归,所以能正常运行。

修复方案

方案1:让方法只负责判断(返回boolean类型)

这种设计更符合单一职责原则,方法专注于判断质数,打印逻辑放在main中:

import java.util.*;

public class Mavenproject2 {

    static boolean isPrime(int x) {
        if (x <= 1) {
            return false;
        }
        // 优化循环范围到sqrt(x),减少循环次数提升效率
        for (int i = 2; i <= Math.sqrt(x); i++) {
            if (x % i == 0) {
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("enter number");
        int x = input.nextInt();
        boolean isPrimeNum = isPrime(x);
        System.out.println(isPrimeNum ? "prime" : "not prime");
        input.close();
    }
}

方案2:保持原打印逻辑,改为无返回值方法

如果想保留方法内的打印逻辑,只需移除递归调用的代码,并把方法改为void类型:

import java.util.*;

public class Mavenproject2 {

    static void prime(int x) {
        boolean f = true;
        if (x == 1 || x == 0) {
            f = false;
        } else {
            for (int i = 2; i < x; i++) {
                if (x % i == 0) {
                    f = false;
                    break;
                }
            }
        }
        System.out.println(f ? "prime" : "not prime");
        // 移除原有的return prime(x); 避免无限递归
    }

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("enter number");
        int x = input.nextInt();
        prime(x); // 直接调用方法,无需打印返回值
        input.close();
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 11:50:23