【问题标题】:Armstrong number in java with recursion带有递归的java中的阿姆斯特朗数
【发布时间】:2022-11-13 12:49:16
【问题描述】:

我必须使用递归方法检查一个数字是否是 Armstrong 数字

public class ArmStrong {
    public static void main(String[] args){
        System.out.println(isArm(407,0,0));
    }
    static boolean isArm(int n,int last,int sum){
        if(n <= 0 ){
            if(sum == n){
                return true;
            }else{
                return false;
            }
        }
        return isArm(n/10,n%10,sum + last*last*last);
    }
}

当我调试时,在isArm 的最后一次调用中,当n 为4 时,会跳过基本语句。

【问题讨论】:

  • 你的问题是什么?
  • 一个解决方案也许
  • ... 什么是“基本声明”?对我来说,当n0 时,它会输入if(...)
  • @neo-code 问题是“也许是一个解决方案”?这不是问题。
  • 对我来说,调试器跳过 if 语句并给出错误

标签: java recursion


【解决方案1】:

您的代码将立即跳转到答案 (if (n &lt;= 0))应用最后一位的立方体。

举个简单的例子,让我们试试9,这显然不是armstrong。

您的代码将首先检查 9 是否为 0 - 不是。所以,我们递归,这将与self(0, 9, 0+0) 一起使用。下一次运行应该再次递归,以便sum + last*last*last 实际上可以完成一些立方。但它永远不会到达那里 - n 是 0,所以,你跳到 if

由于您的变量名有点泄露,last 指的是上一次运行结束的数字,但您并没有立方。

解决方案是简单地将立方体放入检查n 是否为空:

您的方法应该做的第一件事是

sum += last*last*last;

然后,第二个问题出现了:这正确地计算出您的总和为 407,但您将其与n 进行核对,显然,0 - 您正在“破坏” n。解决这个问题的一种简单方法是将原始的 n (未受干扰的)作为第四个参数传递。我将把它作为练习留给读者。

【讨论】:

    猜你喜欢
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多