2014-08-28 87 views
0

我希望您能幫助我更正此方法的輸出。遞歸版本返回我需要的,但non_recursive版本不返回相同的結果。這裏是我的代碼:返回1 + 1/2 + 1/3 + ... + 1/n的系列

public static double sum_nr(int n){ 
    int result = 1; 
    for(int i=n-1; i>0; i--){ 
     result += 1/i; 
    } 
    return result; 
} 

public static void main(String[] args){ 
    Scanner scan = new Scanner(System.in); 
    System.out.println("Is the string a palindrome or not? "); 
    String test = scan.nextLine(); 
    System.out.println("Answer: " + isPalindrome_r(test)); 
    System.out.println("Answer: " + isPalindrome_nr(test)); 
    System.out.println("What is the sum of n number: "); 
    int test2 = scan.nextInt(); 
    System.out.println("Answer: " + sum_r(test2)); 
    System.out.println("Answer: " + sum_nr(test2)); 
} 

遞歸版本時n = 101.6179775280898876

非遞歸版本n = 102.0

我想這兩個既相匹配。你可以幫我嗎?

+0

怎麼樣的遞歸版本 - 頭腦與我們分享它還是應該猜到的? – alfasin 2014-08-28 03:51:10

+0

請將'sum_r()'方法定義添加到您的問題中。 – dimo414 2014-08-28 03:53:05

回答

2

請勿對result使用int。聲明它是一個double。另外,對分子使用雙字面量詞進行分割。這兩個問題密謀造成不良行爲。特別是,1/i是整數除法,對於所有的i> 1評估爲0.如果使用1.0/i,則不會發生這種情況,因爲i在劃分之前被提升爲double

public static double sum_nr(int n){ 
    double result = 1;   // <-- first change 
    for(int i=n-1; i>0; i--){ 
     result += 1.0/i;  // <-- second change 
    } 
    return result; 
} 
+0

代表數學系! – nbro 2014-08-28 04:08:48

0

1/i將1我== 1和0任何由於您使用int我> 1。因此,您的結果爲2.

請使用doublefloat來進行計算。

0

以下兩個版本返回相同的結果:

public static void main(String[] args) throws IOException { 

     System.out.println(sum_nr(10)); //3.928968253968254 
     System.out.println(sum_r(10)); //3.928968253968254 
    } 

    public static double sum_nr(int n){ 
     double result = 1; 
     for(int i = n; i > 0; i--){ 
      result += 1.0/i; 
     } 
     return result; 
    } 

    public static double sum_r(int n){ 
     if (n == 0) { 
      return 1; 
     } 
     else { 
      return 1.0/n + sum_r(n-1); 
     } 
    }