使用递归的说明

时间:2012-05-20 04:33:49

标签: java recursion

class RecTest
{
    int values[];

    RecTest(int i)
    {
        values=new int[i];
    }

    void pray(int i)
    {
        if (i==0) return;
        else 
        {       
            System.out.println(+values[i-1]);
            pray(i-1);
        }
    }
}

class aka
{
    public static void main(String h[])
    {
        RecTest ob=new RecTest(10);
        int i;
        for(i=0;i<10;i++)
            ob.values[i]=i;
        ob.pray(10);
    }
}

这个程序运行正常,它按降序打印9,8,7,6,5,4,3,2,1,0。 但是当我交换System.out.println(+ values [i-1])和pray(i-1)语句时,它会按升序打印0到9。

有人能解释我为什么会这样吗?

我无法理解它。 Source-Java-2,完整参考,第5版,第171页

3 个答案:

答案 0 :(得分:7)

无论您是在堆栈中打印还是重新打印,都会发生变化。打印当前的数字然后更深或更深,然后打印当前的数字。

3 >
    2 >
        1 >
        print 1
    print 2
print 3

3
print 3 >
         2
         print 2 >
                  1
                  print 1

答案 1 :(得分:2)

当你采取这个部分时

System.out.println(+values[i-1]);
pray(i-1);

切换它们,考虑代码的进展。

执行步骤进行祈祷,但在它可以打印任何东西之前,它再次被送到祈祷中,(这次是i = 8),在它打印出来之前,它再次被发送到祈祷中(我= 7)。

最后,在这条链的深处,祈祷终于退出。当i = 0时,祈祷返回,并且执行减慢的链开始展开。

链中的最低打印被调用(当i = 0时),然后那个祈祷方法退出,链中的下一个打印被调用(i = 1)...等...

像这样可视化递归代码有点困难,但只是想象一下当你的方法首次从main调用时的确切执行流程,并逐步逐步完成。此外,如果您仍然无法看到正在发生的事情,那么使用调试器可能会有所帮助。

答案 2 :(得分:1)

这样写,你的代码说“打印i-1,然后做其他所有事情”。所以它打印9,然后继续其他数字。在这种情况下,“做其他所有事情”意味着打印8,7等等。但重要的是,9首先打印出来。

但是,如果你反转这两行代码,它会说“做其他所有事情,然后打印i-1”。所以它处理其他数字,然后打印9.在这种情况下,“处理”意味着打印...,7,8。但重要的是,9最后打印。