简体   繁体   English

我的递归代码在Java中计算数字根有什么问题? 我该如何解决?

[英]What's wrong with my recursion code to calculate the digital root in Java? How can I fix it?

This is the first time I have tried recursion, so sorry for the stupidity. 这是我第一次尝试递归,请为您的愚蠢感到抱歉。 I am trying to calculate the digital root of a number by Java. 我正在尝试通过Java计算数字的数字根。 I checked that we could calculate it by dividing by 9, but I still want to use recursion. 我检查了是否可以将其除以9来进行计算,但是我仍然想使用递归。 Could you tell me what's wrong with my recursion code in Java? 您能告诉我Java递归代码怎么了吗? How can I fix it? 我该如何解决? Could you provide sample code for me? 您能为我提供示例代码吗?

public static void main(String[] args) {
    Scanner console = new Scanner(System.in);
    int inputnumber = inputnumber(console); 
    int sumofdigit = sumofdigit(inputnumber);
    int digitalroot = digitalroot(inputnumber);
    System.out.println("That number is :" + digitalroot);
}

//input console
public static int inputnumber(Scanner console){
    System.out.println("Please input: ");
    int num = console.nextInt();
    return num;}

public static int digitalroot(int inputnumber ) {
    if(inputnumber<10){
        return inputnumber;
    } else {
        return digitalroot(sumofdigit(inputnumber));
    }
}

// calculate sum of digits
public static int sumofdigit(int inputnumber){
    return sumofdigit(inputnumber/10) + inputnumber%10; 
}

Your recursion never ends. 您的递归永远不会结束。 Try this with the added if statement: 尝试使用添加的if语句:

public static int sumofdigit(int inputnumber) {
    if (inputnumber<10)
        return inputnumber;
    return sumofdigit(inputnumber/10) + inputnumber%10; 
}

You have a simlar snippet in digitalroot , but you primarily need it in sumofdigit . 您在digitalroot有一个类似的代码段,但主要是在sumofdigit它。

I'd say it is slightly easier to just stop recursion once you hit zero (one less magic number, and it's more often the case that you can stop recursion at zero). 我想说的是,一旦您到达零(仅减少一个魔术数字,并且更经常地可以将递归停止为零),则停止递归会稍微容易一些。

public static int sumofdigit(int inputnumber) {
    if (inputnumber == 0)
        return 0;
    return sumofdigit(inputnumber / 10) + inputnumber % 10;
}

Not that it matters much, but it at least tries to handle summing negative numbers (albeit returning a negated sum). 并不是很重要,但是它至少尝试处理负数的总和(尽管返回的是负数)。

当您的inputnumber小于10时,sumofdigit方法应返回一个值以结束递归

Your problem is here: 您的问题在这里:

public static int sumofdigit(int inputnumber){
        return sumofdigit(inputnumber/10) + inputnumber%10; 
}

To fix this you should do: 要解决此问题,您应该执行以下操作:

public static int sumofdigit(int inputnumber) {
    if (inputnumber<10)
        return inputnumber;
    return sumofdigit(inputnumber/10) + inputnumber%10; 
}

Here is some explanation on the problem and the solution: 这是有关问题和解决方案的一些解释:

As you might know, any recursion can be turned into a while loop. 您可能知道,任何递归都可以变成while循环。 Your problematic recursion can be turned into 您有问题的递归可以转化为

public static int sumofdigit(int inputnumber) {
    while(true){
      inputNumber = (inputNumber / 10) + (inputnumber%10); 
    }
    return inputNumber;
}

As you can see, this method will never return and will loop undefinitively. 如您所见,此方法将永远不会返回并且将不确定地循环。 A quick fix would be to return when inputnumber<10 快速解决方案是在inputnumber<10时返回

public static int sumofdigit(int inputnumber) {
    while(inputnumber>=10){
      inputNumber = (inputNumber / 10) + (inputnumber%10); 
    }
    return inputNumber;
}

Which turned back into recursion gives: 变成递归的结果是:

public static int sumofdigit(int inputnumber) {
        if (inputnumber<10)
            return inputnumber;
        return sumofdigit(inputnumber/10) + inputnumber%10; 
}

I wouldn't do this recursively either: 我也不会递归地这样做:

public static int sumofdigit(int x) {
    int sumofdigit = 0;
    while(x != 0) {
        sumofdigit += x % 10;
        x /= 10;
    }
    return sumofdigit;
}

public static int digitalRoot(int x) {
    while(x > 9) {
        x = sumofdigit(x);
    }
    return x;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM