2012-10-15 45 views
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)); 
    } 
} 
+0

你有一个调试器一步一步的检查呢? – Zavior

+5

在你的分数计算中使用双打,即'(1.0/n)'。 – Vulcan

+0

是的,我做到了。但是,通过调试器来处理递归问题是很困难的,然而,由于有太多的级别,所以很难跟踪正在发生的事情。 – vaindil

回答

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 /(...)))

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

+0

就是这样!其他人建议使用双打,这绝对是问题的一部分,但你也在'return'声明中得到了更正。谢谢! – vaindil

+0

很高兴我可以帮助:)递归总是棘手的业务。 – Brian

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

+0

嗯,这是问题的一部分,但我也错误地实现了我的公式(它应该是'return(1.0/n)+ harmonic(n - 1)')''谢谢! – vaindil

+1

很高兴我能帮上忙!指出为什么你得到'0',而不是超出这一点。布赖恩走得更远 – Claudiu

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)` 
} 
2

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

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

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

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

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

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