递归 - 线程中的异常" main" java.lang.StackOverflowError的

时间:2016-05-30 20:53:22

标签: java recursion

我需要编写一个递归方法。我编写了代码来执行没有递归的任务。我收到错误线程中的异常" main"在Exercise13r.recursion(Exercise13r.java:29)的java.lang.StackOverflowError。代码是...输入一个数字然后如果结果是偶数,除以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;
    }
}

1 个答案:

答案 0 :(得分:3)

你的基本案例if (number != 1)需要在函数的定义中,以便它实际知道何时停止。现在你的程序最终减少到调用recursion(1)并且你的函数仍然会递归地调用它自己(它还能做什么?)所以它最终调用recursion(2)再次导致recursion(1)所以上。

请注意,如果您在递归调用之前移动System.out.println ("number: " + n); ,这一点就会变得明显。由于你有无限的递归,它永远不会打印任何阻止你看到问题的东西。

Here是一个最小的工作示例:

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