日常记录——递归、方法调用栈分析
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
声名:满足条件调用两次split方法,
将分别用两种方法调用栈作为基准
无论是否满足if条件必被调用&方法调用栈
规律:split(number 永远会执行,直到return)
即A: split 12、6、3、1 永远会触发 返回12情况下不进行展示 那么必有返回值如下顺序
1 3 6
当满足3 的时候 程序优先走 split((number + 1) / 2)
即有 B: split 4、2、1 对应返回值顺序如下
1、2
这个 1、2在split 3 时候被调用,且先于A中split 1 执行 先进行显示(执行顺序跟弹栈顺序不要弄混)
即结果为
B: 12 A: 136
12136
不进行详细说明
优先调用
split 12、6、3、2、1
固定输出 1 2 3 6
只需要考虑split 3 中 特殊情况
split 3 中 执行完 if 中代码块后,已经有 print 1 2
输出 12
再执行无论是否满足条件 都将要触发代码 print(split (3/2))
print split(1)–return 1
输出121
特殊情况split 3 结束
最终结果:12136
优先调用&方法调用栈做基准(详细图解)
(
方法优先执行,
即如果满足 number%2!=0 条件先只考虑
split((number + 1) / 2)
这个基本操作,后续操作当作挂载在此操作后的操作暂时不予理会
)
方法调用栈如下 向上弹出
number | split | return |
---|---|---|
1 | 1 | |
2 | 1 | 2 |
3 | 2 | 3 |
6 | 3 | 6 |
12 | 6 | 12 |
num==2,不满足条件
split 1 --return 1
print:1
num==3,满足条件
split 2—return 2
print:2
走split 3/2
(这里split 1 一次压入新栈)
number | split | return |
---|---|---|
1 | 1 |
split 1 return 1
print:1
num==6,不满足条件
split 3 --return 3
print:3
num==12,不满足条件
split 6–return 6
print:6