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