谐波序列递归

时间:2012-10-15 21:27:33

标签: java recursion

我真的得到了递归(或者我认为),但这个问题让我感到沮丧。我试图返回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));
    }
}

8 个答案:

答案 0 :(得分: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/20; 1/2.00.5

答案 1 :(得分: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 /(...)))

这是一个非常令人困惑的功能,但是我想(我第三次编辑它)这次我说得对。

答案 2 :(得分: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)`
}

答案 3 :(得分:2)

你需要使用双打。现在,你正在做1 / n,两者都是整数。将其更改为:

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

递归部分不应包括 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;

}

答案 6 :(得分: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);
    }
}

答案 7 :(得分:-1)

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