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页
答案 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最后打印。