2 u011562926 u011562926 于 2013.11.05 12:10 提问

java递归原理求高人解惑

int i=1;
int Test(int n){
System.out.println("*****************"+(i++));
int result =0;
if(n==1)
return 1;
result = Test(n-1)*n;
System.out.println(result+" "+n);
return result;
}
我进行调试,比如n=8,只打印第一条语句,打了八次,当n=1时返回结果1,跳出方法,然后继续执行,此时n变为2,为何?再然后只执行第二条打印语句的内容,为何?直到n变为8。求解啊...

1个回答

shimucheng
shimucheng   2013.11.05 12:51
已采纳

递归方法虽然是方法调用方法本身,但是每次调用的时候变量是不共享的
你可以这样理解 以8为例
System.out.println("*****************"+(i++));
int result =0;
if(n==1)
return 1;
result = Test(n-1)*n;
这段代码执行的时候第一层(n=8)调用了第二层(n=7),第二层调用了第三层(n=6),以此类推
到达第八层之后n=1,return后不再继续调用,此时由第八层(n=1)返回至第七层(n=2)来执行
System.out.println(result+" "+n);
return result;
第七层将n=2执行完毕后回到第六层n=3再次执行这段代码,最后回到第一层n=8

u011562926
u011562926 谢谢,已经用了很多递归了,按照你讲的那么理解,是挺爽的,等以后基础深厚点再返回来看看。
接近 4 年之前 回复
shimucheng
shimucheng 1.因为在这一行你再次调用了这个方法,递归调用主要就是调用方法本身和跳出条件 2.每一层方法中虽然都有n和result,实际上他们并不是同一个对象,每一层方法拥有自己的n和result,并不共享,在Test(n=1)和return result的时候做值传递而不是地址传递。或者你这样理解这个问题,虚拟机在对方法分配内存地址的时候就标记了每一个n是哪一层方法的
接近 4 年之前 回复
u011562926
u011562926 经过你这样说,我可以理解,但是不理解为什么会这么做,比如:1.为什么会是以result=Test(n-1)*n为分界线,它的机制是什么?2.当n=1时有返回值,但n继续递增时,它怎么确定返回值的?
接近 4 年之前 回复
shimucheng
shimucheng 以result=Test(n-1)*n;这句作为分界线,执行到这句之前第七层(n=2)是由第六层传进来的,执行这句时第七层调用第八层,传递参数n=1;等待第八层处理结束之后赋值给result。此时第七层并没有结束,是处于等待状态。第八层中接收n=1,返回1,将这个1赋值给第七层中的result,第七层继续执行后面的语句。第七层执行完之后把result传给第六层,在第六层再次执行,直至回到第一层执行完毕
接近 4 年之前 回复
shimucheng
shimucheng 打印之前的语句在往里走的时候执行过了
接近 4 年之前 回复
u011562926
u011562926 我想了解得深入点,据上所说,当到达第八层之后,n=1,return,第八层返回第七层(n=2)执行,为何会不执行第二条打印语句前的内容呢?还有,result的赋值过程是怎么样的?
接近 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片