首页 > 试题广场 > 下面这段程序的输出结果是() public class Ma
[单选题]
下面这段程序的输出结果是()
public class Main {
    public static void main(String[] args) {
        split(12);
    }
    public static int split(int number) {
        if (number > 1) {
            if (number % 2 != 0) System.out.print(split((number + 1) / 2));
                System.out.print(split(number / 2));
            }
        return number;
       }
}

  • 12136
  • 63121
  • 61213
  • 11236
考察方法进栈与出栈的顺序。先进后出
有个知识点,方法在出栈的时候,执行的是return语句。因为出栈就意味着方法结束并消费,如果没有return语句,那么方法出栈的时候什么都不执行,就直接销毁。
1.执行split(12)时,执行代码System.out.print(split(number / 2))
    split(12/2)进栈,此时number=6;
2.执行split(6)时,执行代码System.out.print(split(number / 2))
    split(6/2)进栈,此时number=3;
3.执行split(3)时,
第1行 if (number % 2 != 0)
第2行          System.out.print(split((number + 1) / 2));
第3行    System.out.print(split(number / 2));
 按照顺序执行   
 先执行第2行
            首先split((3+1)/2)进栈,此时number=2,
            再执行split(2),那么split(2/2)进栈,此时number=1, 最后return 1,
            注意此时第2行代码还没有结束
            此时
            split(2/2)出栈,输出1;
            split((3+1)/2)出栈,输出2;
   第二行代码结束,再执行第三行,此时number=3,执行System.out.print(split(number / 2))
           split(3/2)进栈,number=1,return,那么就需要出栈了
split(3/2)出栈,输出1
split(6/2)出栈,输出3
split(12/2)出栈,输出6;
最终结果12136;

split(number)方法,最终返回的是number这个值,所以split(n)出栈的输出结果就是n

整理:
split(12/2)进栈
split(6/2)进栈

split((3+1)/2)进栈
split(2/2)进栈
       split(2/2)出栈,输出1
        split((3+1)/2)出栈,输出2

split(2/2)进栈
        split(2/2)出栈,输出1

split(6/2)出栈,输出3
split(12/2)出栈,输出6
  

发表于 2019-08-30 15:34:25 回复(10)
这是个考眼力的题,就是if那里判断条件,两条中间没有else分隔,格式也不规范,所以不管是否满足条件,第二个输出语句都会执行!!!!
发表于 2019-10-07 23:45:52 回复(0)
sout split(6) = {
    sout split(3) = {
        sout split(2) = {
            sout split(1)
            return 2
        }
        sout split(1)
        return 3;
    }
    return 6
}
执行顺序很清晰了,12136
发表于 2020-01-22 20:29:39 回复(0)
1、先进后出,所以递归先执行递归到最深处,在栈顶的方法。
2、第八行永远执行
发表于 2019-11-22 17:05:19 回复(0)
因为第二个打印代码并没有else,所以等于3的时候,任然会执行第二个打印的代码
编辑于 2019-08-23 21:21:15 回复(0)
一般在答题的时候不会去写程序来跑。只能自己心里演算。然后用笔记录。我这个题是蒙对了。心里算到最里面那一层,然后返回的时候就乱了。😂
发表于 2019-09-29 17:10:11 回复(0)
这题感觉不对啊,
发表于 2019-09-20 15:37:32 回复(0)

12 print(split(6)) return 125️⃣

6 print(split(3)) return 64️⃣

3 print(split(2))2️⃣

print(split(1)) return 33️⃣

2 print(split(1)) return 2 1️⃣

1 return 1

从下往上打印,主要考验的是Java中参数压栈的问题

编辑于 2019-08-24 22:43:19 回复(0)
最后面是打印顺序:
split(12) = 12
split(12/2) = 6 <5>
  split(6/2) = 3 <4>
    split(3+1/2) = 2 <2>
      split(1) = 1 <1>
    split(3/2) = 1 <3>
发表于 2020-04-01 16:52:59 回复(0)
怎么就涉及到进出栈的问题了
发表于 2020-03-31 15:50:29 回复(0)
递归调用,先进后出
发表于 2020-02-10 13:38:04 回复(0)
好烦程序题
发表于 2019-12-09 17:08:38 回复(0)
画个图 慢慢来 都不会错 画图横着画好理解。
发表于 2019-11-27 08:57:47 回复(0)
每次看到递归有输出就一脸蒙蔽了。。。脑子转不过来。。
发表于 2019-10-22 14:16:51 回复(0)
我的天,典型递归居然没发现。
发表于 2019-10-14 22:28:56 回复(0)
递归调用的输出画栈来解
发表于 2019-09-25 22:49:05 回复(0)
实验结果是12136,没错
发表于 2019-09-24 14:40:52 回复(0)
输出来的是五个结果1,2,1,3,6。哪里会返回12?第一次main方法中调用spilt()方法,并没有输出这个方法的返回值12。
发表于 2019-08-28 21:41:39 回复(0)
12: print(split(6))-->6   return 12
6:   print(split(3))-->3   return  6
3:   print(split((3+1)/2))  -->2
      print(split(3/2)) -->1  return 3
2:   print(split(1))-->1 return 1
发表于 2019-08-26 17:48:00 回复(0)
java代码中函数的参数压栈的问题,其中注意当参数为3的时候调用了两次split函数,而其中首先输出(3+1)/2,再输出(3/2)
发表于 2019-05-20 17:12:32 回复(0)