Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 递归-线程中的异常;“主要”;栈溢出_Java_Recursion - Fatal编程技术网

Java 递归-线程中的异常;“主要”;栈溢出

Java 递归-线程中的异常;“主要”;栈溢出,java,recursion,Java,Recursion,我被要求写一个递归方法。我已经编写了无需递归即可执行任务的代码。我在Exercise13r.recursion(Exercise13r.java:29)的线程“main”java.lang.StackOverflowerError中得到错误异常。代码是。。。输入一个数字,若结果为偶数,则除以2,若结果为奇数,则乘以3,然后减去1。显然,我在循环,但不知道为什么。任何协助都将不胜感激 import java.util.Scanner; public class Exercise13r {

我被要求写一个递归方法。我已经编写了无需递归即可执行任务的代码。我在Exercise13r.recursion(Exercise13r.java:29)的线程“main”java.lang.StackOverflowerError中得到错误异常。代码是。。。输入一个数字,若结果为偶数,则除以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;
    }
}
如果(number!=1)需要在函数的定义内,这样它才能真正知道何时停止。现在,您的程序最终会减少到调用递归(1),而您的函数仍然会递归地调用自己(它还能做什么?),因此它最终会调用递归(2),从而导致再次调用递归(1),以此类推

请注意,如果移动
System.out.println(“编号:+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

当number result=1时要停止的程序您需要在
递归中移动“我现在应该停止吗”复选框。目前,
if
的两个分支再次调用该函数,它将永远循环。在哪种情况下,您认为可以退出
递归
方法?谢谢您的提示。不幸的是,我本来就是这样做的,我把它搬了出去,希望能解决这个问题。在发布之前忘记将其移回。当我把它放在里面的时候,它仍然会循环。公共静态void递归(long n){if(n!=1){if(n%2==0){recursion(n/2);}else{recursion(n*3-1);}System.out.println(“number:+n);}return;}确保首先检查基本情况,如果是真的,则函数在返回递归调用之前返回。同时移动打印,以便查看正在发生的情况。如果您仍然无法获取,请使用最新代码编辑您的问题。更改基本大小写以检查是否为真,但它仍然循环。还在每个“if”语句中添加了print语句,但从未打印过一条。更改的代码:公共静态无效递归(长n){if(n==1)返回;{if(n%2==0){递归(n/2);System.out.println(“偶数:+n);}否则{递归(n*3-1);System.out.println(“奇数:+n);}@您需要在递归之前打印以查看发生了什么。我看不出您的代码有任何错误。请检查我的更新答案。@shoes我测试了您在此处注释的两段代码,它们工作正常。您在其他地方做错了。