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/201/2.00.5

于 2012-10-15T21:28:26.920 回答
10

好吧,一方面,你不想 return (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 / (...) ) )

顺便说一句,这是一个非常令人困惑的功能,但我认为(我第三次编辑它)这次我做对了。

于 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

在除法计算中使用双打。目前,所有内容都被转换为整数,失去了您通常期望的任何浮点精度。

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 回答
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 回答
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 回答
0

这是我对调和数递归的实现。

double harmonic(int n){

    if(n == 1)return 1;
    else return 1.0 / n + harmonic(n - 1);

}
于 2021-12-08T21:30:01.273 回答
-1
 public static double harmonic(int n)
   {
      if (n==1)
      return 1/n;
      else return 1/n + harmonic(n-1);
   }
于 2018-11-02T16:49:32.563 回答