我真的得到递归的挂钩(或者我认为),但是这个问题让我绊倒了。我试图返回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));
}
}
我真的得到递归的挂钩(或者我认为),但是这个问题让我绊倒了。我试图返回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));
}
}
嗯,一个,你不希望返回(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 /谐波(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);
}
}
你有一个调试器一步一步的检查呢? – Zavior
在你的分数计算中使用双打,即'(1.0/n)'。 – Vulcan
是的,我做到了。但是,通过调试器来处理递归问题是很困难的,然而,由于有太多的级别,所以很难跟踪正在发生的事情。 – vaindil