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

ゼロに到達したら、再帰を停止する方が少し簡単だと思います (マジック ナンバーが 1 つ少なくなり、ゼロで再帰を停止できることがよくあります)。

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

私もこれを再帰的にしません:

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 に答える
1

入力番号が 10 より小さい場合、sumofdigit メソッドは再帰を終了する値を返す必要があります。

于 2012-07-02T19:48:27.153 に答える