2016-04-05 7 views
0

正の整数Nについては、合計を1/1 + 2/3 + ... + N/(2N-1)にします。N /(2N - 1)の再帰的和

私の再帰的なSumメソッドは、無限ループでスタックされており、理由はわかりません。変数を出力するとき、私はfirst(私のパラメータ)が増加していることに気付きました。インクリメントvalueには決して達しません。

public double Sum(double first) { 

    if (first > 1) { 
    System.out.println("first :" + first); 
    value += first/(Sum(2*first - 1) + Sum(first-1)); 
    System.out.println("val: " + value); 
    return value; 
    } 

    if (first <= 1) { 
     return 1; 
    } 
    else { 
     return value; 
    } 

} 

答えて

5

if (first > 1)ブランチで再帰呼び出しを行います。

これらの再帰呼び出しの最初はSum(2*first - 1)です。これと他の再帰呼び出しは、完全に評価してからvalueをインクリメントする必要があります。引数には> 1もあります。したがって、同じブランチを入力し続けることで、これらの再帰呼び出しを無制限に(または、少なくとも2倍に格納された最大値を超えるまで)行います。


あなたは再帰的にNから始まることをしたい場合は、とにかく2回の再帰呼び出しを必要としません:

public double Sum(int first) { 
    if (first <= 1) { 
    return 1; 
    } else { 
    return first/(2.0 * first - 1) + Sum(first - 1); 
    } 
} 

その後Sum(N)を呼び出すことによって、それを評価します。

1
value += first/(2*first - 1) + Sum(first-1);