2016-12-02 41 views
2

我在試着理解需求,但是我發現了一個任務,我已經幾天沒有解決了。 X = 1/1 + 1 /(1 * 2)+ 1 /(1 * 2 * 3)+ 1 /(1 * 2 * 3 * 4)+ 1 /(1 * 2 * 3 * 4)用java遞歸求解諧波因子序列

* 5).....

我該如何解決100次重複無條件運算符?

它可以解決沒有遞歸?

我試過這段代碼,但它不能正常工作,它包含「如果」。

public static double harFac(double n) { 
    if (n == 1) return 1; 
    return (1.0/(n * harFac(n - 1))) + harFac(n - 1); 
} 

回答

2

我相信你可以做這樣的事情:

double result = 0; 
int div = 1; 
for (int i = 1; i <= 100; i++){ 
    result += 1.0/div; /*the division needs to take place in floating point*/ 
    div *= i+1; 
} 
+0

這個問題是關於遞歸而不是迭代。 – Pshemo

+0

那麼他問是否有可能解決無遞歸 –

+0

對不起,您可能是對的。 「我可以在沒有遞歸的情況下解決嗎?」因爲這個「我」在開始時並不是很清楚。根據我在Stack Overflow上看到的多年,也可能意味着OP可能已經知道如何在不遞歸的情況下解決它(取決於我們如何糾正該句)。如果你編輯你的答案,將刪除我的投票。無論如何,它看起來像你的解決方案有一個小問題,因爲'1/div'是整數除法,所以'1/2'將返回'0'而不是'0.5'。 – Pshemo

1

如果您評估分母這樣很快就會遇到麻煩,因爲它會很快達到極限。在處理浮點時,首先評估較小的術語也是一個好主意。

幸運的,你可以通過重鑄表達解決這兩個問題,

1 * (1 + 1/2 * (1 + 1/3 * (1 + 1/4 * (...))))

所以你的最後一項是在遞歸foo = 1 + 1.0/100,在遞歸倒數第二項是1 + 1/98 * foo,等等。

我個人不會使用遞歸來解決這個問題,而是在一個函數中使用循環。

0

你是對的,但你不應該叫harFac兩次。您需要改爲計算除數。但是,如果沒有if條件,我看不出如何做到這一點。

public static double harFac(double n) 
{ 
    if (n == 1) return 1; 

    int divisor = 1; 
    for (int i = 2; i <= n; ++i) divisor *= i; 

    return (1.0/divisor) + harFac(n - 1); 
} 

因爲除數變得如此龐大這不超出各地n = 30工作。

+0

感謝您的幫助! –