递归方法调用倒底是怎么样的逻辑啊?public class ou {
static int s=0;
 public void osi(int i ){
   if(--i>0){
 System.out.print(i+"#");//第一个打印语句
 this.osi(i);
System.out.print(i+"*");//第二个打印语句
 }
  }
 public static void main(String args[]){
 ou o=new ou();
 o.osi(10);
 }
}按照我的学java的思路:参数10传入if语句,每执行一次 i减去1,然后执行第一个打印语句,再执行this.osi(i);然后跳出if语句,如此执行到i==1 if条件就不在成立了,那就跳出了if的范围.第二个打印语句应该从来没有执行到过,但这个程序的运行结果却是
9#8#7#6#5#4#3#2#1#1*2*3*4*5*6*7*8*9*  百思不得其解,请高手指教下.

解决方案 »

  1.   

    这应该和java的内存堆栈有关系,每次递归相当于入栈操作,最后释放内存堆栈的时候顺序自然就是反的了,但是我也不太明白为什么还要打出1*2*3*4*5*6*7*8*9*,但是debug发现就是i=1以后执行的相当于出栈的操作,lz可以debug看下
      

  2.   

    这个很容易理解的:
    1.首先楼主要明白,
    第一个打印语句和第二个打印语句在同一个{ }内,中间尽管有一个this.osi(i);
    但执行完这个调用后,第二个打印语句就会执行,并且打出来的i值和第一条打印语句的i是相同的
    2.递归的理解:
    简单的说就是若干次重复使用,可以看错是嵌套,一个球里还有小球,小球里面还有更小的球,哈哈
    3.还不能理解的话,建议自己动手去写一个简单的算法
    比如:汉诺塔
      

  3.   

    9#8#7#6#5#4#3#2#1# 执行到this.osi(i);
    当i等于1时,条件为假,返回一层一层往上返回,所以是1*2*3*4*5*6*7*8*9*。
     
      

  4.   

    每次打印i+"#"后,if判断已经结束