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

如何用Java递归验证阿姆斯特朗数?代码调试遇基准条件未触发问题

问题排查与修复

核心问题分析

  1. 基准条件逻辑完全错误:当n <= 0时,你拿sum和n做比较,但此时n已经被除到0,根本不是原始输入的数,完全不符合阿姆斯特朗数的判断逻辑。而你调试时看到n=4不触发基准条件是正常的——因为4>0,只有当n被除到0才会进入基准条件分支。
  2. 递归参数传递错误:递归调用时,你用sum + last * last * last作为新的累加和,但last是上一次传入的参数,第一次调用时last=0,导致第一次累加的是0³,完全没用到当前n的最后一位,立方和计算全程错误。
  3. 未保留原始数值:阿姆斯特朗数要求各位立方和等于原始输入数,但你的递归过程中没有保存原始数,最后根本无法做正确的比较。

修复后的代码

public class ArmStrong {

    public static void main(String[] args) {
        System.out.println(isArmstrong(407));
    }

    // 对外调用方法,仅需传入待判断的数
    static boolean isArmstrong(int num) {
        // 调用递归方法,传入原始数、当前处理数、累加和初始值
        return isArm(num, num, 0);
    }

    // 递归核心方法:original保存原始数,n为当前处理的数,sum为累加的立方和
    static boolean isArm(int original, int n, int sum) {
        // 基准条件:当n被除到0时,比较累加和与原始数
        if (n <= 0) {
            return sum == original;
        }
        // 取出当前n的最后一位
        int lastDigit = n % 10;
        // 递归:n除以10,sum加上当前最后一位的立方
        return isArm(original, n / 10, sum + lastDigit * lastDigit * lastDigit);
    }
}

修复说明

  • 新增对外的isArmstrong方法,简化调用逻辑的同时,把原始数值传递给递归方法保存。
  • 递归方法新增original参数,始终保留原始输入数,用于基准条件的最终判断。
  • 直接计算当前n最后一位的立方并累加到sum中,彻底修正了原代码参数传递的错误。
  • 基准条件改为比较sum和original,符合阿姆斯特朗数的定义。

内容的提问来源于stack exchange,提问作者neo-code

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 11:20:33