11

私は本当に再帰のコツをつかんでいます(またはそう思います)が、この問題は私をつまずかせています。1 + 1/2 + 1/3 + ... + 1 / nを返そうとしていますが、何を試してもメソッドは1.0を返します。私は一生の間、何が悪いのか理解できません。

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

9 に答える 9

13

浮動小数点除算を使用する場合:

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

つまり:1/2です0; 1/2.0です0.5

于 2012-10-15T21:28:26.920 に答える
10

たとえば、 を返したくないだけでなく、算術演算(1 / n) + (1 / harmonic(n - 1))を使用する必要があります。double

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

1 / harmonic別の関数を完全に返すため、そのままにしておくと、次のようになります。

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

ところで、それは理解するのが非常に紛らわしい機能ですが、(3回目の編集で)今回は正しく理解できたと思います。

于 2012-10-15T21:30:47.167 に答える
2

これは、整数の除算で整数の結果が得られるためです。

それで、1/2 == 0

floating-point次のように除算を使用できます。-

if(n == 1.0) {
    return 1.0;
} else {
    return (1.0 / n) + harmonic(n - 1); // Should be `harmonic(n - 1)`
}
于 2012-10-15T21:29:00.990 に答える
2

ダブルスを使用する必要があります。今、あなたはやっています1 / n、どちらも整数です。次のように変更します。

return (1.0 / n) + (1.0 / harmonic(n - 1));
于 2012-10-15T21:29:09.313 に答える
1

再帰部分には1/harmonic(n-1)を含めない でください。

   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;

}
于 2014-01-27T23:56:19.677 に答える
1

割り算で double を使用します。現在、すべてが int にキャストされ、通常期待される浮動小数点の精度が失われます。

public static double harmonic(int n) {
    if (n == 1) {
        return 1;
    } else {
        return (1.0 / n) + (1.0 / harmonic(n - 1));
    }
}
于 2012-10-15T21:30:40.883 に答える
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);
    }
}
于 2016-01-04T07:16:31.220 に答える