[英]Strange Java Multiplication Recursion with StackOverFlow
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));
}
}
取自http://en.wikipedia.org/wiki/Stack_overflow
堆棧溢出的另一個主要原因是嘗試在堆棧上分配更多內存而不是適合,例如通過創建太大的本地數組變量。
Juned Ahsan是對的,你可以嘗試增加堆大小以適應你的遞歸。 看看這個鏈接:
遞歸使用堆棧在到達終止條件之前存儲函數調用,這會導致堆棧中的項目彈出並生成最終結果。
java函數堆棧的大小取決於分配給堆棧的虛擬內存。 您可以嘗試通過為-Xss
JVM參數設置適當的值來-Xss
進行-Xss
。
如果遞歸依賴於輸入值而越來越深,那么您應該考慮分解任務。
在Java中,每個方法調用都會在堆棧上放置一條激活記錄,直到完成為止。 遞歸會產生與方法調用一樣多的激活記錄。 因此,與基本上使用goto語句的迭代設計相比,遞歸算法不能無限深地運行; 因此它是遞歸算法設計的局限之一。
考慮這兩個文件: IterationTest.java
將永遠運行愉快(如果在Bash終端上運行,使用ctrl + c終止文件的執行,例如在Linux中),而RecursionTest.java
幾乎會立即失敗。
/*
* Runs perfectly fine forever
* (use ctrl + c to escape execution in terminal, if on Linux)
*/
public class IterationTest
{
public static void printMe()
{
while(true)
{
System.out.println("iteration");
}
}
public static void main(String[] args)
{
printMe();
}
}
/*
* Guaranteed StackOverflow error using infinite recursion
*/
public class RecursionTest
{
public static void printMe()
{
System.out.println("iteration");
printMe();
}
public static void main(String[] args)
{
printMe();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.