1

这是我第一次尝试递归,对愚蠢感到抱歉。我正在尝试通过 Java 计算数字的数字根。我检查了我们可以通过除以 9 来计算它,但我仍然想使用递归。你能告诉我我在 Java 中的递归代码有什么问题吗?我该如何解决?你能为我提供示例代码吗?

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; 
}
4

5 回答 5

5

你的递归永远不会结束。if用添加的语句试试这个:

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

您在 中有一个类似的片段digitalroot,但您主要需要在sumofdigit.

于 2012-07-02T19:40:41.610 回答
2

我想说一旦你达到零就停止递归会稍微容易一些(少一个幻数,更常见的情况是你可以在零处停止递归)。

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

并不是说它很重要,但它至少尝试处理对负数求和(尽管返回一个否定的总和)。

于 2012-07-02T20:04:28.837 回答
1

你的问题在这里:

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

要解决此问题,您应该这样做:

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

以下是对问题和解决方案的一些解释:

您可能知道,任何递归都可以变成一个while循环。你有问题的递归可以变成

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

正如你所看到的,这个方法永远不会返回并且会不确定地循环。一个快速的解决办法是在什么时候返回inputnumber<10

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

这又变成了递归给出:

public static int sumofdigit(int inputnumber) {
        if (inputnumber<10)
            return inputnumber;
        return sumofdigit(inputnumber/10) + inputnumber%10; 
}
于 2012-07-02T20:00:59.877 回答
1

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

于 2012-07-02T19:48:27.153 回答
1

我也不会递归地这样做:

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;
}
于 2012-07-02T20:03:18.630 回答