以递归方式生成阿姆斯特朗数的更好方法

时间:2012-07-28 23:08:34

标签: java recursion

有一种更优雅的方式来递归写这个吗?阿姆斯特朗号码

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

2 个答案:

答案 0 :(得分:4)

也许我错了(这里的1AM ......),但据我所知,你的实现实际上根本不是递归。与

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

你迭代地进行整个计算,直到tmp为0.因此在下一行

  

return sum + arm(temp);

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

我希望你喜欢它; - )

答案 1 :(得分:1)

如果你想用java流做,你可以这样做。

public boolean isArmstrongNumber(String number) {
    int exponent = number.length();
    if (Integer.parseInt(number) == number.chars()
            .map(n -> n - '0')
            .map(n ->(int) Math.pow(Integer.parseInt("" + n),exponent))
            .sum())
        return true;
    else return false;
}