2016-12-02 12 views
2

私はreqursionを理解しようとしていますが、1つのタスクを見つけました。数日前には解決できませんでした。 (1 * 2 * 3)+ 1 /(1 * 2 * 3 * 4)+ 1 /(1 * 2 * 3 * 4)となる。 * 5).....Java再帰を使って高調波列を解く

どうすれば条件演算子なしで100回繰り返して解決できますか?

再帰せずに解くことはできますか?

私はこのコードを試しましたが、正しく動作せず、 "If"が含まれています。

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.5'ではなく' 0'を返すので、あなたの解は少し問題があるようです。 – Pshemo

1

非常に迅速に限界に達するので、分母を評価すると、すぐに問題に遭遇します。浮動小数点を使って作業するときは、最初に小さな用語を評価することも良い考えです。

幸いあなたはだからあなたの最後の項は再帰である

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

に式を作り直すことによって、これらの問題の両方を解決することができるが、再帰で最後から二番目の項はそうで1 + 1/98 * fooあり、かつ、foo = 1 + 1.0/100です。

私は個人的にこれを解決するために再帰を使用せず、単一の関数でループを使用します。

0

あなたは正しい線に沿っていますが、harFacを2度呼んではいけません。代わりに除数を計算する必要があります。あなたが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

は助けてくれてありがとう! –