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
相关产品推荐
相关产品推荐

