![](/img/trans.png)
[英]Java - Recursion - Exception in thread “main” java.lang.StackOverflowError
[英]Recursion - Exception in thread “main” java.lang.StackOverflowError
我需要寫一個遞歸方法。 我已經編寫了無需遞歸即可執行任務的代碼。 我在Exercise13r.recursion(Exercise13r.java:29)的線程“ main” java.lang.StackOverflowError中得到錯誤Exception 。 代碼是...輸入一個數字,然后如果結果為偶數,則除以2,如果結果為奇數,則乘以3並減去1。顯然我在循環,但不確定為什么。 任何援助將不勝感激。
import java.util.Scanner;
public class Exercise13r
{
public static void main(String[] args)
{
// Initialize variables
long number = 0;
Scanner in = new Scanner(System.in);
System.out.println ("Enter a starting number: ");
number = in.nextInt ();
System.out.println ("Your starting number is: " + number);
if (number != 1)
{
recursion(number);
}
}
public static void recursion(long n)
{
if (n % 2 == 0)
{
recursion(n/2);
}
else
{
recursion(n*3-1);
}
System.out.println ("number: " + n);
return;
}
}
您的基本情況if (number != 1)
需要在函數的定義之內,以便它實際上知道何時停止。 現在,您的程序最終減少為調用recursion(1)
並且您的函數仍將遞歸地調用自身(它還能做什么?),因此它最終會調用recursion(2)
,從而再次導致recursion(1)
,依此類推。
請注意,如果您移動System.out.println ("number: " + n);
這會變得很明顯System.out.println ("number: " + n);
在遞歸調用之前 。 由於您具有無限遞歸,因此它永遠不會遍歷打印任何東西,從而使您無法看到問題。
這是一個最小的工作示例:
class Exercise13r {
public static void main(String[] args) {
recursion(12);
}
public static void recursion(long n) {
System.out.println ("number: " + n);
if (n != 1) {
if (n % 2 == 0) {
recursion(n/2);
} else {
recursion(n*3-1);
}
}
}
}
輸出:
number: 12
number: 6
number: 3
number: 8
number: 4
number: 2
number: 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.