递归函数bottom_up执行结果疑惑求助:为何输出1到5?
理解Bottom-Up递归的执行逻辑
先看你提供的两段代码核心差异:递归调用和输出语句的顺序不同,这直接决定了执行流程和结果。
拆解bottom_up(5)的执行过程
递归函数的执行依赖「调用栈」——每一次递归调用都会把当前函数的状态(比如未执行完的代码)暂存起来,直到被调用的子函数完全执行完毕,才会回到当前函数继续执行剩下的代码。
调用bottom_up(5)时,执行步骤如下:
- 调用
bottom_up(5):进入else分支,先执行bottom_up(4),print(5)暂时不执行 - 调用
bottom_up(4):进入else分支,先执行bottom_up(3),print(4)暂时不执行 - 调用
bottom_up(3):进入else分支,先执行bottom_up(2),print(3)暂时不执行 - 调用
bottom_up(2):进入else分支,先执行bottom_up(1),print(2)暂时不执行 - 调用
bottom_up(1):进入else分支,先执行bottom_up(0),print(1)暂时不执行 - 调用
bottom_up(0):触发if条件,直接返回(没有执行任何代码) - 回到
bottom_up(1):执行之前暂存的print(1),输出1,然后返回 - 回到
bottom_up(2):执行之前暂存的print(2),输出2,然后返回 - 回到
bottom_up(3):执行之前暂存的print(3),输出3,然后返回 - 回到
bottom_up(4):执行之前暂存的print(4),输出4,然后返回 - 回到
bottom_up(5):执行之前暂存的print(5),输出5,然后返回
整个过程是先递归到最底层的终止条件,再从底层往上层回溯执行输出语句,所以最终输出顺序是1、2、3、4、5。
top_down(5)的执行对比(参考)
top_down的逻辑是先执行输出,再递归调用,执行步骤完全相反:
- 调用
top_down(5):进入else分支,先print(5)输出5,再调用top_down(4) - 调用
top_down(4):进入else分支,先print(4)输出4,再调用top_down(3) - 调用
top_down(3):进入else分支,先print(3)输出3,再调用top_down(2) - 调用
top_down(2):进入else分支,先print(2)输出2,再调用top_down(1) - 调用
top_down(1):进入else分支,先print(1)输出1,再调用top_down(0) - 调用
top_down(0):触发if条件,直接返回 - 逐层返回,执行结束,输出顺序为5、4、3、2、1
内容的提问来源于stack exchange,提问作者Tristan Reza
相关产品推荐
相关产品推荐

