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