簡體   English   中英

遞歸-線程“ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM