有一种更优雅的方式来递归写这个吗?阿姆斯特朗号码
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);
}
}
}
答案 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;
}