public static float recursiveUse(float n2){
if(n2 == 1)
return 1;
return recursiveUse(1/n2);
}
public static void main(String[] args) {
float n2;
Scanner stdin = new Scanner(System.in);
System.out.println("Please enter a number: ");
n2 = stdin.nextFloat();
System.out.print(1+(recursiveUse(n2)));
}
/*
Write a Java application that uses recursion to compute the results of the following series:
m(i) = 1 + 1/2 + 1/3 + 1/4 + 1/5 … + 1/i
*/
我目前遇到堆栈溢出异常的问题。我很确定这是因为基数是正确的。我的问题是如何找到上面系列的基础。我搜索过该网站,但我找不到适用于此问题的任何内容。
谢谢
答案 0 :(得分:0)
问题是你期望1/2或1/3 ....有时会等于1,它永远不会满足,因此你继续重复递归调用,最后jvm放弃了StackOverflowException给你。
我相信你的意思是减少n2值,然后检查相等为1.反正试试这个:
public static double recursiveUse(int n2) {
if (n2 == 1)
return 0.;
return 1 / (double) n2 + recursiveUse(n2 - 1);
}
这将根据您的需要添加1 / n2 + 1 /(n2-1)并返回结果,因此您可以在此方法返回的结果中添加1。
答案 1 :(得分:0)
您的recursiveUse
方法完全错误。仔细观察它,你会发现,根据输入它将永远不会返回,或只返回1
。第二点使它变得毫无用处,第一点使它继续运行,直到它溢出堆栈。
你想要谐波系列1 + 1/2 + 1/3 … + /i
的一部分的总和。让我们调用我们的方法harmonicSum
:
public static double harmonicSum(int i)
{
/* Code will go here */
}
现在对于任何给定的 i ,其中i≥1,我们应该给出的结果与1/i + harmonicSum(i - 1)
相同。例如3
我们1 + 1/2 + 1/3
(1 + 1/2) + 1/3
是{harmonicSum(2)+ 1/3。
我们需要有一个点,我们只是停下来并返回一个答案,但显而易见的是harmonicSum(0)
是0
,因此这给了我们(并且也意味着我们不必分开)零)。
因此,必要的代码必须完全符合:
public static double harmonicSum(int i)
{
if(i < 0)
throw new IllegalArgumentException("i must be positive.");
if(i == 0)
return 0;
return 1.0 / (double)i + harmonicSum(i - 1);
}
由于我们已经完成了你的作业,试着找出如何在没有递归的情况下做同样的事情,以及每个人的利弊。