2016-07-08 23 views
0

術語的數目我需要計算與式一系列總和遞歸函數:求和給出了一系列的N作爲(遞歸)

(3×-1)/ 2(X + 1)/* X每個週期和x增加從1開始*/

例如:如果你輸入2,答案必須是從[(2/4)+(5/6)]

我已經1.3333爲執行該操作的函數做了一個代碼,但是對於大於2的所有值,它輸出0.0值0-2和1.0。

public double summation(int intN){ 
    if(intN == 0) 
     return dbSum; 
    else { 
     dbSum = ((3*intX)-1)/(2*(intX+1)); 
     intX++; 
    } 
    return (summation(intN - 1)); 
} 

我非常需要幫助。提前致謝。

+1

你是否打算增加'dbSum'這個數量?如果是這樣,你可能想使用'+ ='(增量),而不是僅僅使用'='(assign)。 –

+0

是的,我是。我剛剛嘗試了您的建議,並且仍然提供了與之前相同的輸出。 – schwall

回答

0

如果您打算增加dbSum,你應該使用遞增運算符:

dbSum += ((3*intX)-1)/(2*(intX+1)); 
    ^Here 

此外,你實際上是在做整數除法:(2/4)+(5/6) == 0 + 0 == 0,不1.333...,即使你將其分配給double。您需要強制分子的至少一個和分母是一個雙:

dbSum += ((3.0*intX)-1)/(2.0*(intX+1)); 

請注意,你有一個初始化的問題,以及在此代碼線程安全的問題,因爲你」重新使用一個成員變量來保存結果:您最初需要確保dbSum == 0,並且沒有其他線程同時調用該方法。這將是更安全的,如果你沒有使用一個成員變量:

public double summation(int intN){ 
    if(intN == 0) 
    return dbSum; 
    else { 
    return ((3.0*intX)-1)/(2.0*(intX+1)) + summation(intN - 1); 
    } 
} 

(你可以把它寫尾遞歸太多,雖然這並不能真正幫助您在Java)。一個for循環將是一個更好的策略,但我想這是一個遞歸練習。

+0

在求和函數之前,dbSum確實在類中初始化爲0。我嘗試了你提供的else語句,但結果中沒有任何變化。 – schwall

+0

哦,總和確實改變了。但不是1.3333它顯示0.5 – schwall

+0

@schwall您需要將該值重置爲零,每次調用該方法時:目前,如果您爲同一輸入調用該方法3次,則會得到不同的結果(只要您修復了整數除法和'intN> 0')。 –