我需要编写一个递归方法。我编写了代码来执行没有递归的任务。我收到错误线程中的异常" 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;
}
}
答案 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