如何用Java递归验证阿姆斯特朗数?代码调试遇基准条件未触发问题
问题排查与修复
核心问题分析
- 基准条件逻辑完全错误:当
n <= 0时,你拿sum和n做比较,但此时n已经被除到0,根本不是原始输入的数,完全不符合阿姆斯特朗数的判断逻辑。而你调试时看到n=4不触发基准条件是正常的——因为4>0,只有当n被除到0才会进入基准条件分支。 - 递归参数传递错误:递归调用时,你用
sum + last * last * last作为新的累加和,但last是上一次传入的参数,第一次调用时last=0,导致第一次累加的是0³,完全没用到当前n的最后一位,立方和计算全程错误。 - 未保留原始数值:阿姆斯特朗数要求各位立方和等于原始输入数,但你的递归过程中没有保存原始数,最后根本无法做正确的比较。
修复后的代码
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
相关产品推荐
相关产品推荐

