令人困惑的递归 StackOverflowError 程序

问题描述 投票:0回答:2

我用 Java 写下了一个递归程序(为了好玩),其中有几件事不清楚:

public class methodTest
{
    public static double methodTest()
    {
        System.out.println("qwerty") ; // sign that this method is called
        methodTest obj1 = new methodTest() ; // creating an object (perhaps unnessary)
        System.out.println(methodTest.methodTest()) ; // ??!
        return methodTest() ; // returning the same function
    }
}
  1. 为什么,如果返回数据类型是
    double
    ,我的 BlueJ 编译器在返回方法时没有显示语法错误?
  2. 如果此方法“递归”的次数使用和不使用递增变量,该程序如何停止? [我尝试使用在类中初始化的静态 int(在
    methodTest()
    之前)并在方法中递增它,但它显示“无法访问的语句”]
  3. 计算机在尝试执行
    System.out.println(methodTest.methodTest())
    语句时在做什么?
  4. 为什么当我用
    cannot find symbol - variable obj1
    替换(在
    System.out.println(methodTest.methodTest())
    中)
    .methodTest
    时,编译器会给出语法错误(
    .obj1
    )?

    请回答我的问题☝️
java testing recursion runtime-error stack-overflow
2个回答
1
投票

这是解决这个问题的一种方法。

备注:

  • 该类公开了一个启动递归的简单方法。
  • 递归方法检查递归次数。
  • 它返回一个硬编码值,因为我不知道你到底想做什么。
public class MySampleClass
{
    private static double methodTestPrivate(int callIndex)
    {
       //Check for terminating condition
       if (callIndex >= 10)
           return 42.0;

       //Recursive call
       return methodTestPrivate(callIndex+1);
    }

    public static double methodTest()
    {  
        return methodTestPrivate(0);
    }
}

public class MyProgram
{
    public static void main(String[] args)
    {
        System.out.print(MySampleClass.methodTest());
    }
}

0
投票
  1. 你不是在返回一个方法,你是在返回(递归)调用该方法的结果,并且该方法被定义为返回双精度所以一切都很好
  2. 没有计数器就没有真正实用的方法,除非您想发疯并使用
    Thread.currentThread().getStackTrace()
    并计算您的方法出现在堆栈中的次数。更简单的方法是传递一个从 0 开始的计数器参数,在任何递归调用中递增它并添加一个条件以在达到您的限制时停止。
  3. 它执行
    methodTest.methodTest()
    并打印它的返回值
  4. 因为
    methodTest
    是静态方法,不能关联实例而
    obj1
    是实例。
© www.soinside.com 2019 - 2024. All rights reserved.