Подтвердить что ты не робот

Рекурсия гармонической последовательности

Я действительно получаю рекурсию (или, как я думаю), но эта проблема меня отключает. Я пытаюсь вернуть 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));
    }
}
4b9b3361

Ответ 1

Ну, например, вы не хотите возвращать (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/(...)))

Это очень запутанная функция, чтобы выяснить, кстати, но я думаю (с моим третьим редактированием времени), на этот раз я понял.

Ответ 2

Вы хотите использовать деление с плавающей запятой:

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.

Ответ 3

Это потому, что целочисленное деление дает целочисленный результат.

Итак, 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)`
}

Ответ 4

Вам нужно использовать парные. Прямо сейчас, вы делаете 1 / n, оба из которых являются целыми числами. Измените его на:

return (1.0 / n) + (1.0 / harmonic(n - 1));

Ответ 5

Используйте двойные вычисления в своих вычислениях. В настоящее время все передается в ints, теряя любую точность с плавающей запятой, которую вы обычно ожидаете.

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

Ответ 6

рекурсивная часть не должна включать 1/гармонику (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;

}

Ответ 7

/**
 * 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);
    }
}