2012-10-15 7 views
11

Tôi thực sự nhận được hàng đệ quy (hoặc vì vậy tôi nghĩ), nhưng vấn đề này đang vấp ngã tôi. Tôi đang cố gắng trả về 1 + 1/2 + 1/3 + ... + 1/n, nhưng không có vấn đề gì tôi thử phương thức trả về 1.0. Tôi không thể cho cuộc sống của tôi tìm ra những gì sai.Đuổi theo trình tự hài hòa

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

Bạn đã kiểm tra điều này với một bước gỡ rối bước? – Zavior

+5

Sử dụng số nhân đôi trong phép tính phân chia của bạn, tức là '(1.0/n)'. – Vulcan

+0

Vâng, tôi đã làm. Tuy nhiên, thật khó để tôi theo dõi các vấn đề đệ quy thông qua trình gỡ lỗi, vì có quá nhiều cấp độ khó để theo dõi những gì đang diễn ra. – vaindil

Trả lời

10

Vâng, trước hết, bạn không muốn quay trở lại (1/n) + (1/harmonic(n - 1)), nhưng cũng có thể bạn cần phải sử dụng double số học:

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

Nếu bạn còn lại nó như 1/harmonic bạn muốn trở lại chức năng hoàn toàn khác :

(1/n) + 1/(1/(n - 1) + 1/(1/(n - 2) + 1/(...)))

Đó là một chức năng rất khó hiểu, btw, nhưng tôi nghĩ (với lần chỉnh sửa thứ 3 của tôi), tôi đã nhận được đúng lúc này.

+0

Đó là nó!Những người khác đề nghị sử dụng đôi, đó chắc chắn là một phần của vấn đề, nhưng bạn cũng có sự điều chỉnh trong câu lệnh 'return'. Cảm ơn bạn! – vaindil

+0

Vui vì tôi có thể giúp :) Đệ quy luôn là việc kinh doanh phức tạp. – Brian

13

Bạn muốn sử dụng phân dấu chấm động:

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

Đó là: 1/20; 1/2.00.5.

+0

Ah, đó là một phần của vấn đề, nhưng tôi cũng đã thực hiện công thức của tôi không chính xác (nó phải là 'return (1.0/n) + harmonic (n - 1);' Cảm ơn bạn! – vaindil

+1

vui vì tôi có thể giúp! chỉ ra lý do tại sao bạn đã nhận được '0', không phải bất cứ điều gì vượt quá điểm đó. Brian đã đi thêm dặm – Claudiu

2

Thats vì số nguyên chia cho kết quả số nguyên.

Vì vậy, 1/2 == 0

Bạn có thể sử dụng thay vì sử dụng floating-point phân chia như thế này: -

if(n == 1.0) { 
    return 1.0; 
} else { 
    return (1.0/n) + harmonic(n - 1); // Should be `harmonic(n - 1)` 
} 
2

Bạn cần phải sử dụng đôi. Ngay bây giờ, bạn đang làm 1/n, cả hai đều là số nguyên. Thay đổi nó thành:

return (1.0/n) + (1.0/harmonic(n - 1)); 
1

Sử dụng tăng gấp đôi trong phép tính phân chia của bạn. Hiện tại, mọi thứ được đúc thành ints, mất đi bất kỳ độ chính xác nào mà bạn thường mong đợi.

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

phần đệ quy không nên bao gồm 1/hòa (n-1) nó phải được

public static double harmonic(int n) 
    { 
    double harm = 0.0; 
    if (n == 1) { 
     return 1.0; 
    } 
    else { 
     harm = harm + (1.0/n) + harmonic(n - 1); 
    } 
    return harm; 

} 
0
/** 
* Created by hrishikesh.mishra on 04/01/16. 
* 
* Describe a recursive algorithm 
* for computing the nth Harmonic number, 
* defined as Hn = ∑ n k=1 1/k. 
* 
*/ 
public class HarmonicNumber { 


    public static void main(String[] args) { 

     System.out.println("Sum up to 1: " + sum(1)); 
     System.out.println("Sum up to 2: " + sum(2)); 
     System.out.println("Sum up to 3: " + sum(3)); 
     System.out.println("Sum up to 4: " + sum(4)); 
    } 


    /** 
    * Summation with recursive method. 
    * @param n 
    * @return 
    */ 
    public static double sum(int n){ 
     if(n <= 1) 
      return 1; 
     else 
      return ((double) 1/n) + sum(n - 1); 
    } 
}