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

时间:2012-07-02 19:34:03

标签: java recursion

这是我第一次尝试递归,对愚蠢感到抱歉。我试图通过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; 
}

5 个答案:

答案 0 :(得分:5)

你的递归永远不会结束。使用添加的if语句尝试此操作:

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

digitalroot中有一个simlar代码段,但您主要需要sumofdigit

答案 1 :(得分:2)

我会说一旦你达到零就停止递归会稍微容易一点(一个较少的幻数,而且更常见的情况是你可以停止递归为零)。

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

并不重要,但它至少试图处理负数的总和(虽然返回一个否定的总和)。

答案 2 :(得分:1)

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

答案 3 :(得分: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; 
}

答案 4 :(得分: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;
}