2012-07-28 88 views
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); 
    } 
} 
} 
+0

這看起來很好 – 2012-07-28 23:10:58

+0

我同意,我看不出有什麼明顯的問題... – sbrichards 2012-07-28 23:12:33

+0

這是對的做法呢?否則,通常迭代解決方案效率更高,因此沒有理由這樣做。 – Jochen 2012-07-28 23:25:04

回答

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

我希望你喜歡它;-)

+0

是的,我喜歡嘗試將迭代解決方案寫成遞歸那些。 – user1560265 2012-07-29 23:20:08

+0

感謝您的帖子...有一個更好的主意...... – user1560265 2012-07-29 23:22:04