2016-05-30 88 views
1

我需要编写一个递归方法。我已经编写了代码来执行没有递归的任务。我在练习13r.recursion(Exercise13r.java:29)处得到线程“main”java.lang.StackOverflowError中的异常。如果结果是偶数,则......如果结果为奇数,则乘以3并减去1.显然,我正在循环,但不知道为什么。任何援助将不胜感激。递归 - 线程“main”中的异常java.lang.StackOverflowError

if (number != 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

计划停车时数的结果= 1 – shoes

+0

你需要移动“我现在应该停止”内部'递归查询'。就目前而言,'if'的两个分支再次调用该函数,并且它永远循环。 –

+0

在哪种情况下,你认为你可以退出'递归'方法? – njzk2

回答

3

你的基本情况是函数的定义里面,这样它实际上知道何时停止。现在你的程序最终会减少到调用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 
+0

感谢您的提示。不幸的是,这是我原来的方式,并希望解决它。在发布之前忘了移回去。当我把它放在里面时,它仍然会循环。公共静态无效递归(长N) \t { \t \t如果(N!= 1) \t \t { \t \t \t如果(N%2 == 0) \t \t \t { \t \t \t \t递归( N/2); \t \t \t} \t \t \t别的 \t \t \t { \t \t \t \t递归(N * 3-1); \t \t \t} \t \t System.out.println(“number:”+ n); \t \t} \t \t return; \t} – shoes

+0

请确保您先检查基本情况,如果它是真的,则在函数返回递归调用之前返回该函数。也移动打印,以便您可以看到发生了什么。如果仍然无法获得,请使用最新的代码编辑您的问题。 –

+0

更改了基本情况以检查是否为真,但仍然循环。还在每个“if”语句中添加了打印语句,但从未打印过一个打印语句。改变的代码:public static void recursion(long n) { if(n == 1)return; (n/2 = 0) { if(n%2 == 0) 递归(n/2); System.out.println(“偶数:”+ n); } else { 递归(n * 3-1); System.out.println(“odd number:”+ n); } } – shoes

相关问题