2

これを再帰的に書くためのよりエレガントな方法はありますか?アームストロング数

PS:15年間学校を休んでいますが、これは宿題ではありません。反復から再帰に変換しようとしているコードの一部です。

import java.util.Scanner;

public class RecArmstrong {
public static void main(String[] args) {
    Scanner keyboard = new Scanner(System.in);

    System.out.print("Enter a number: ");
    int number = keyboard.nextInt();

    //Error checking
    while(number < 0 || number > 100000){
        System.out.print("Enter a number: ");
        number = keyboard.nextInt();
    }

    if(arm(number) == number)
        System.out.println(number + " is an armstrong number");
    else
        System.out.println(number + " is not an armstrong number.");

}

public static long arm(long n){

    long temp, sum, digits = 0;
    long remainder;
    temp = n;
    sum = 0;

    if (temp == 0)
        return 0; //base case
    else{
        while (temp != 0){
        digits++; //number of digits for exponent
        temp = temp / 10;
    }
    temp = n; //set temp back to original number
    while (temp != 0){
        remainder = temp % 10;
        sum += Math.pow(remainder, digits);
        temp = temp / 10;
    }
        return sum + arm(temp);
    }
}
}
4

2 に答える 2

4

たぶん私は間違っています(ここでは午前1時です..)が、私が知る限り、あなたの実装は実際には再帰ではありません。と

while (temp != 0){
        remainder = temp % 10;
        sum += Math.pow(remainder, digits);
        temp = temp / 10;
    }

tmp が 0 になるまで、計算全体を繰り返し実行します。したがって、次の行で

合計 + 腕 (温度) を返します。

arm(temp) は常に 0 を返します!

私は自分自身の簡単な再帰を一緒にハックしました。これは、最後の数字から始めて、数字ごとに機能します。すべての再帰呼び出しは元の数値の全長を必要とするため、関数のオーバーロードが必要です。

public static long arm(long n){
   return arm(n, Integer.toString(n).length());
}
public static long arm(long n, int num_digits){

   if(n==0) //recursion finished
      return;
   // n%10 gives last digit
   return java.lang.Math.pow(n%10,num_digits) + arm(n/10, num_digits);
}   

気に入ってくれるといいな ;-)

于 2012-07-28T23:28:03.397 に答える