递归方法的后递增?

时间:2016-12-02 21:49:32

标签: java recursion

我正在尝试学习java oop,我发现一些问题,理解为什么在递归方法中使用后增量会导致错误?我不明白。

主要类别:     公共课主要{

    public static void main(String[] args) {
        A a = new A();
        a.res(0);
    }        
}

代码工作正常:

public class A {

    public void res(int a){
        if (a < 5)
            res(a+1);   
        System.out.println(a);
    }
}

输出:运行:

5

4

3

2

1

0 建立成功(总时间:0秒)

但是当我使用++运算符时,我得到了StackOverflowError。

public class A {

    public void res(int a){
        if (a < 5)
            res(a++);   
        System.out.println(a);
    }
}

4 个答案:

答案 0 :(得分:3)

你混淆了++和++ a。根据java文档 - “唯一的区别是前缀版本(++结果)评估为增量值,而后缀版本(结果++)评估为原始值”。

在您的情况下,始终使用参数0

调用递归方法

答案 1 :(得分:1)

后增量运算符在使用后递增变量,因此它只会在返回递归函数后递增变量。

您的代码正在执行此操作:

res(a++) //a = 0
//now a = 1

递归永远不会到达下一行,因此递归函数将始终调用res(0)

参考文献:https://stackoverflow.com/a/2371162/7238307

答案 2 :(得分:0)

嗯......你到底想要什么?让我们稍微重新编写您的程序。您的程序(崩溃的程序)可以像这样有效地重写,实现相同的效果(即由于StackOverflowError而崩溃):

public class A {
    public void res(int a){
        if (a < 5) {
            res(a);  
            ++a;
        }  
        System.out.println(a);
    }
}

您的变量a只会在对res的递归调用完成后才会递增...这绝不会,因为您始终使用相同的值调用res

答案 3 :(得分:0)

这是使用a+1解决recusrive调用的方式。

a=0, res(0)
+ 0 < 5, res(1)
++ 1 < 5, res(2)
+++ 2 < 5, res(3)
++++ 3 < 5, res(4)
+++++ 4 < 5, res(5)
++++++ 5 = 5, print 5
+++++ print 4
++++ print 3
+++ print 2
++ print 1
+ print 0

关于使用a++的代码的问题是在执行递归调用之后执行增量。所以你基本上得到:

a=0, res(0)
+ 0 < 5, res(0)
++ 0 < 5, res(0)
+++ ...