使用StackOverFlow进行奇怪的Java乘法递归

时间:2015-02-20 01:24:11

标签: java recursion iteration stack-overflow

Java程序使用迭代和递归正常运行。但由于一些奇怪的原因,我无法理解当我输入的数字超过9200时,我得到一个StackOverFlow。我尝试过很长一段时间,但这是我能想到的。任何关于如何以及为何发生这种情况的想法以及如何解决这个问题都可以计算任何数字?

import java.util.Scanner;

public class Multiplication {

    public static long multiIterative(long a, long b) {
        long result = 0;
        while (b > 0) {
            result += a;
            b--;
        }
        return result;
    }

    public static long multiRecursive(long a, long b) {
        if (a == 0 || b == 0) {
            return 0;
        }
        return a + multiRecursive(a, b - 1);
    }

    public static void main(String[] args) {
        Scanner userInput = new Scanner(System.in);
        System.out.print("Please enter first Integer: ");
        long a = userInput.nextInt();
        System.out.print("Please enter second Integer: ");
        long b = userInput.nextInt();
        System.out.println("The Multiplication Iteration would be: " + multiIterative(a, b));
        System.out.println("The Multiplication Recursion would be: " + multiRecursive(a, b));
    }

}

3 个答案:

答案 0 :(得分:2)

取自http://en.wikipedia.org/wiki/Stack_overflow

  

堆栈溢出的另一个主要原因是尝试   在堆栈上分配的内存超过了适合的内存,例如   创建太大的本地数组变量。

Juned Ahsan是对的,你可以尝试增加堆大小以适应你的递归。看看这个链接:

Java stack overflow error - how to increase the stack size in Eclipse?

答案 1 :(得分:1)

递归使用堆栈在到达终止条件之前存储函数调用,这会导致堆栈中的项目弹出并生成最终结果。

java函数堆栈的大小取决于分配给堆栈的虚拟内存。您可以尝试通过为-Xss JVM参数设置适当的值来对其进行微调。

如果递归越来越深,取决于输入值,那么你应该考虑分解任务。

答案 2 :(得分:0)

在Java中,每个方法调用都会在堆栈上放置一条激活记录,直到完成为止。递归会产生与方法调用一样多的激活记录。因此,与基本上使用goto语句的迭代设计相比,递归算法不能无限深地运行;因此它是递归算法设计的局限之一。

考虑这两个文件:IterationTest.java将永远幸运地运行(如果在Bash终端上运行,则使用 ctrl + c 终止文件的执行,例如在Linux中),而{ {1}}几乎会立即失败。

RecursionTest.java