A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 肥洋洋 于 2014-6-8 16:43 编辑
  1. public class Demo {
  2.         public static void main(String[] args) {
  3.                         run(1);
  4.                         
  5.         }
  6.         public static void run(int i){
  7.                 System.out.println(i);
  8.                 if(i<3){
  9.                         run(i*2);
  10.                 }
  11.                 System.out.println(i);
  12.         }
  13. }
复制代码
为什么是1 2 4 4 2 1,请解释一下

11 个回复

倒序浏览
本帖最后由 依然阿邦 于 2014-6-8 00:33 编辑

run函数中又调用了run函数本身
这样就构成了一个循环,循环条件是if(i<3)

初始化i=1
放入run函数中,
{
输出一个1
当i<3时,执行语句run(i*2)
        {
        此时i=2
        输出一个2
        执行run(i*2)
                {
               此时i=4
               输出一个4
               if判定失败
               输出一个4
               }
        输出一个2
        }
再输出一个1
}

表达能力不是很好,勉强的看吧
回复 使用道具 举报 2 0
这个就是值传递和引用传递的区别,这里run方法里的i的值和run方法里面进行递归调用的时候的i的值没关系,方法里面的值改变不会影响外面的值,给你写了个小例子是引用传递,你看看大概就能明白了,如果还不明白可能要看看毕老师的关于引用类型的内存分配部分的视频了
  1. package demo1;
  2. public class Demo11 {
  3.         public static void main(String[] args) {
  4.                 Person12 p=new Person12();
  5.                         run(p);
  6.                         
  7.         }
  8.         public static void run(Person12 p){
  9.             System.out.println(p.age);
  10.             if(p.age<3){
  11.                             p.age=p.age*2;
  12.                     run(p);
  13.             }
  14.             System.out.println(p.age);
  15.     }
  16.         /*
  17.         public static void run(int i){
  18.                 System.out.println(i);
  19.                 if(i<3){
  20.                         run(i*2);
  21.                 }
  22.                 System.out.println(i);
  23.         }
  24.         */
  25. }
  26. class Person12
  27. {
  28.         int age=1;
  29. }
复制代码
回复 使用道具 举报 1 0
楼主想要得到的是什么样的结果呢??
回复 使用道具 举报 1 0
这是个函数自调嵌套.第一次i = 1 i = 2时候  它的if 判定为真.他会执行run 但是他还会执行下面的输出语句.只不过是在if调完以后输出.这就是为什么看到了之后多了个2 1 4;而不是2 1 ;这么说不知道能明白不.
好好想一下应该没什么问题.加油!
回复 使用道具 举报
给你一张图,我刚画的,虽然有点丑,但是应该能看懂,大概程序这么走的

无标题.jpg (72.87 KB, 下载次数: 15)

无标题.jpg

评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

回复 使用道具 举报 3 0
楼主肯定还没有学递归,建议看看比老师关于File类中,递归的讲解,一看就明白。
回复 使用道具 举报
依然阿邦 发表于 2014-6-8 00:30
run函数中又调用了run函数本身
这样就构成了一个循环,循环条件是if(i

i在自己调用的时候不会覆盖之前的i嘛??为什么2 和1还会数出来,他们存在哪里?
回复 使用道具 举报
好吧,顶一楼的,好牛,还配图的...
回复 使用道具 举报
大神无处不在
回复 使用道具 举报
佩服那个画图的,真细心
回复 使用道具 举报
a6217815 发表于 2014-6-8 01:16
给你一张图,我刚画的,虽然有点丑,但是应该能看懂,大概程序这么走的

正解!   
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马