黑马程序员技术交流社区

标题: 大神们,下面程序结果为什么是这样??求分析一下晕了 [打印本页]

作者: 肥洋洋    时间: 2014-6-8 00:13
标题: 大神们,下面程序结果为什么是这样??求分析一下晕了
本帖最后由 肥洋洋 于 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,请解释一下
作者: 依然阿邦    时间: 2014-6-8 00:30
本帖最后由 依然阿邦 于 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
}

表达能力不是很好,勉强的看吧

作者: 月光海    时间: 2014-6-8 00:33
这个就是值传递和引用传递的区别,这里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. }
复制代码

作者: 沉默的爱    时间: 2014-6-8 00:53
楼主想要得到的是什么样的结果呢??
作者: 夏季熬成了秋    时间: 2014-6-8 00:56
这是个函数自调嵌套.第一次i = 1 i = 2时候  它的if 判定为真.他会执行run 但是他还会执行下面的输出语句.只不过是在if调完以后输出.这就是为什么看到了之后多了个2 1 4;而不是2 1 ;这么说不知道能明白不.
好好想一下应该没什么问题.加油!
作者: a6217815    时间: 2014-6-8 01:16
给你一张图,我刚画的,虽然有点丑,但是应该能看懂,大概程序这么走的

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

无标题.jpg

作者: 谭荣强    时间: 2014-6-8 02:14
楼主肯定还没有学递归,建议看看比老师关于File类中,递归的讲解,一看就明白。
作者: 肥洋洋    时间: 2014-6-8 08:08
依然阿邦 发表于 2014-6-8 00:30
run函数中又调用了run函数本身
这样就构成了一个循环,循环条件是if(i

i在自己调用的时候不会覆盖之前的i嘛??为什么2 和1还会数出来,他们存在哪里?
作者: ☆枫の云    时间: 2014-6-8 08:32
好吧,顶一楼的,好牛,还配图的...
作者: 师在飞    时间: 2014-6-8 08:42
大神无处不在
作者: crazystraw    时间: 2014-6-8 09:18
佩服那个画图的,真细心
作者: kongyan4696    时间: 2014-6-8 09:47
a6217815 发表于 2014-6-8 01:16
给你一张图,我刚画的,虽然有点丑,但是应该能看懂,大概程序这么走的

正解!   




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