日常记录——递归、方法调用栈分析

日常记录——递归、方法调用栈分析

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)
这个基本操作,后续操作当作挂载在此操作后的操作暂时不予理会

方法调用栈如下 向上弹出

numbersplitreturn
11
212
323
636
12612

num==2,不满足条件

split 1 --return 1
print:1

num==3,满足条件

split 2—return 2
print:2
走split 3/2

(这里split 1 一次压入新栈)

numbersplitreturn
11

split 1 return 1
print:1

num==6,不满足条件

split 3 --return 3
print:3

num==12,不满足条件

split 6–return 6
print:6

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值