我真的掌握了递归的窍门(或者我认为),但这个问题让我很困惑。我正在尝试返回 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));
}
}
您想使用浮点除法:
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
。
好吧,一方面,你不想 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 / (...) ) )
顺便说一句,这是一个非常令人困惑的功能,但我认为(我第三次编辑它)这次我做对了。
那是因为整数除法给出整数结果。
所以,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)`
}
你需要使用双打。现在,你正在做1 / n
,这两个都是整数。将其更改为:
return (1.0 / n) + (1.0 / harmonic(n - 1));
在除法计算中使用双打。目前,所有内容都被转换为整数,失去了您通常期望的任何浮点精度。
public static double harmonic(int n) {
if (n == 1) {
return 1;
} else {
return (1.0 / n) + (1.0 / harmonic(n - 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;
}
/**
* 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);
}
}
这是我对调和数递归的实现。
double harmonic(int n){
if(n == 1)return 1;
else return 1.0 / n + harmonic(n - 1);
}
public static double harmonic(int n)
{
if (n==1)
return 1/n;
else return 1/n + harmonic(n-1);
}