堆栈溢出并找到一个基础

时间:2014-11-28 12:18:09

标签: java recursion stack-overflow

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

*/

我目前遇到堆栈溢出异常的问题。我很确定这是因为基数是正确的。我的问题是如何找到上面系列的基础。我搜索过该网站,但我找不到适用于此问题的任何内容。

谢谢

2 个答案:

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

由于我们已经完成了你的作业,试着找出如何在没有递归的情况下做同样的事情,以及每个人的利弊。