黑马程序员技术交流社区

标题: 递归方法的执行步骤是怎么执行的,有点迷糊了。 [打印本页]

作者: 黄昆    时间: 2012-6-14 09:56
标题: 递归方法的执行步骤是怎么执行的,有点迷糊了。
大家来看看这段代码,说说他的执行顺序,视频中看的不是太清楚...
  1. public class Damo4 {

  2.         public static void main(String[] args) {
  3.                 swap(3);
  4.         }
  5.        
  6.         public static void swap(int i){
  7.                 System.out.println(i);
  8.                 i--;
  9.                 for(int j = 0;j<i;j++){
  10.                         swap(i);
  11.                 }
  12.         }
  13. }
复制代码

作者: ☆丿灬北纬28°    时间: 2012-6-14 10:16
先从main进入,然后调用swap函数参数为3,在swap函数中先输出参数一次,然后参数自减,然后调用自身参数为2,最后条用函数,参数为1
作者: 杨雪    时间: 2012-6-14 10:24
给你画了个图

。。。
作者: 李盼    时间: 2012-6-14 10:26
本帖最后由 李盼 于 2012-6-14 10:47 编辑

一 首先,swap(3);执行,会先打印i的值,此时为3
二 然后i--,此时i的值为2,定义j=0,i大于j,条件满足,继续调用swap(2);打印i的值,此时为2
三 然后i--,此时i的值为1,又重新定义了j=0,i大于j条件满足,继续调用swap(1);,打印i的值,此时为1
四 然后i--,此时i的值为0.重新定义j=0,i大于j条件不满足,那么就会停止调用swap(0)
五 此时就会继续判断第三步,for循环里面的j自加1后,变为了1,而第三步里面的i的值为1,i大于j条件不满足,那么就会停止调用swap(1)
六 第三步循环已经结束了,那么这个方法调用完了,会返回第二步,此时i为2,j++后为1,那么ii大于j条件满足,调用swap(2),然后打印i的值,此时i为2
七 然后i--,此时i的值为1,重新定义j=0,i大于j条件满足,继续调用swap(1);,打印i的值,此时为1
八 然后i--, 此时i的值为0,重新定义j=0,i大于j条件不满足,循环结束,方法执行完,返回第七步
九 第七步循环继续,j++,j=1而i也等于1.不满足条件,循环结束,返回第二步
十 第二步的j在第六步时自加了1,这次循环再加1.结果为2,此时i的值也是2,条件不满足,循环结束。整个方法调用完
结果就是 3 2 1 2 1

未命名.jpg (127.86 KB, 下载次数: 82)

未命名.jpg

作者: 张_涛    时间: 2012-6-14 10:31
我画了个图,一般递归我都是画图解释的。
想得会乱,还是画图好!

未命名.jpg (36.24 KB, 下载次数: 87)

图解

图解

作者: 黑马—陈磊    时间: 2012-6-14 10:33


作者: 钟成军    时间: 2012-6-14 10:52
分析见图

sdfg.JPG (38.11 KB, 下载次数: 81)

sdfg.JPG

作者: 黄昆    时间: 2012-6-14 13:19
钟成军 发表于 2012-6-14 10:52
分析见图

这个透彻。。。
作者: 黄昆    时间: 2012-6-14 18:46
我懂了,谢谢啦!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2