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

Java实现两数GCD计算方法传入25、15时返回-1问题求助

问题排查结论

你写的GCD方法传入25、15返回-1的核心原因是:参数校验逻辑的位置错误。你在递归方法的最开头加了「任意入参小于10就返回-1」的判断,但辗转相除法递归计算的过程中必然会产生小于10的中间余数,这个判断会在递归中途被错误触发,直接返回-1。

入参25、15的执行流程复现

  • 第一次方法调用:入参first=25、second=15,两个值都≥10,通过校验,计算余数25%15=10,余数不为0,递归调用getGreatestCommonDivisor(15, 10)
  • 第二次方法调用:入参first=15、second=10,两个值都≥10,通过校验,计算余数15%10=5,余数不为0,递归调用getGreatestCommonDivisor(10, 5)
  • 第三次方法调用:入参first=10、second=5,其中second=5<10,直接触发开头的校验分支返回-1,这个错误值顺着递归调用栈逐层返回,就是你最终拿到的输出结果。

修正方案

如果你的业务要求用户最初传入的两个原始参数必须都≥10,否则返回-1,那这个范围校验不能放在递归方法内部,否则会把递归产生的合法中间值当成非法参数拦截。正确做法是把参数校验和GCD递归逻辑拆分:

public static int getGreatestCommonDivisor(int first, int second){
    // 仅对最外层传入的原始参数做范围校验
    if(first < 10 || second < 10){
        return -1;
    }
    // 校验通过后,调用不带范围判断的纯GCD计算逻辑
    return calculateGcd(first, second);
}

private static int calculateGcd(int a, int b){
    int remaining = a % b;
    if(remaining != 0){
        return calculateGcd(b, remaining);
    }
    return b;
}

修正后传入25、15时,递归计算到(10,5)时不会被范围校验拦截,最终会返回正确结果5。如果你的业务本身没有「入参必须≥10」的要求,直接删掉最开头的<10判断分支即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 07:15:32