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