【问题标题】:My codes give an exception while using recursive function我的代码在使用递归函数时出现异常
【发布时间】:2017-07-10 07:44:20
【问题描述】:

我正在尝试在不使用 java 循环的情况下打印从 1 到 10 的数字。当 n+1 在第 6 行传递给 recursivefun 方法调用时,它工作正常。但是当 n++ 传递时,代码会抛出错误:/

public class PrintWithoutUsingLoops {

    public static void recursivefun(int n) {
        if (n <= 10) {
            System.out.println(n);
            recursivefun(n++);//an exception is thrown at this line.
        }
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        recursivefun(1);
    }

}

【问题讨论】:

  • 那么例外是什么?堆栈溢出,任何机会?您是否在调试器中单步执行了代码?输出是什么,你期望它是什么? (您应该能够仅根据输出找出它失败的原因......)

标签: java exception exception-handling parameter-passing


【解决方案1】:
recursivefun(n++);

n 的原始值传递给递归调用(因为您使用的是后增量运算符),使此递归无限(因为每个递归调用都获得相同的n 值,永远不会达到11)并通向StackOverflowError

改成

recursivefun(n+1);

recursivefun(++n);

【讨论】:

    【解决方案2】:
    recursivefun(n++);
    

    post-increment 通话。后增量是一种在读取后放大值的机制。在这种情况下,你总是传递 1。

    您可以使用pre-increment,即++n,它首先:递增然后传递值。

    您得到的异常是StackOverflowError,这意味着堆栈已满,JVM 无法在堆栈上存储更多调用,因此无法恢复。

    【讨论】:

      【解决方案3】:
      recursivefun(n++);
      

      这一行的意思是:调用recursivefun(n);,然后增加n by 1,所以你总是会用n=1调用你的函数,并肯定会导致stackOverflow

      所以你需要在所有函数之前增加 n,你有一些选择:

      recursivefun(n+1);
      //-----------------------------
      n++;
      recursivefun(n);
      //-----------------------------
      recursivefun(++n); //pre-cincrement
      

      【讨论】:

        【解决方案4】:

        事实上,后自增运算符和前自增运算符都会增加变量的值。他们的行为会根据使用的上下文发生变化。假设如下代码:

        对于循环 1: 对于 (i=0; i

        对于循环 2: 对于 (i=0; i

        在上述两个语句中,for 循环迭代 10 次,与使用的增量样式无关。但是请考虑以下代码:

        int x = 10;
        int y = 20;
        int z = x++ + ++y; // z = 10 + 21
        System.out.println("x = " + x); // prints 11
        System.out.println("y = " + y); // prints 21
        System.out.println("z = " + z); // prints 31
        

        因此从您的代码中可以明显看出 recursivefun(n++);

        使用参数 1 无限调用 recursivefun。为避免 StackOverFlow 错误,请使用 ++n 或 n+1。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-07-12
          • 2013-08-29
          • 2012-03-31
          • 1970-01-01
          • 2015-06-28
          • 2018-03-13
          • 1970-01-01
          相关资源
          最近更新 更多