求讲解这段C++递归代码的运行逻辑,触发base条件后流程是怎样的?
递归代码运行逻辑详解
首先拆解fun函数的固定执行规则:
- 当传入参数
n == 0时,直接结束函数返回,不做任何操作 - 当
n > 0时,执行5次循环:每次先打印当前的n值,再调用fun(n-1),等fun(n-1)完全执行完后,再进入下一次循环
从小规模参数入手理解逻辑
我们从最小的参数值开始推导,更容易找到规律:
1. n=1的执行过程
调用fun(1)时:
- n不为0,进入循环,i从0到4共执行5次:
- i=0:打印
1,调用fun(0)直接返回,本次循环结束 - i=1:打印
1,调用fun(0)直接返回,本次循环结束 - i=2:打印
1,调用fun(0)直接返回,本次循环结束 - i=3:打印
1,调用fun(0)直接返回,本次循环结束 - i=4:打印
1,调用fun(0)直接返回,本次循环结束
最终fun(1)的输出是:1 1 1 1 1
- i=0:打印
2. n=2的执行过程
调用fun(2)时:
- n不为0,进入循环,共执行5次:
- 每次循环先打印
2,再调用fun(1)(已知fun(1)会输出5个1)
- 每次循环先打印
- 5次循环结束后,总输出为5组「
2后面跟5个1」,也就是:2 1 1 1 1 1 2 1 1 1 1 1 2 1 1 1 1 1 2 1 1 1 1 1 2 1 1 1 1 1
通用规律
由此可以推出通用规则:fun(k)的输出,是5组重复的「k + fun(k-1)的全部输出」
触发终止条件后的回溯逻辑
你能看懂的开头5 4 3 2 1,是第一次递归深入到最底层的过程:
main调用
fun(5)→ 进入fun(5)第一次循环(i=0)→ 打印5→ 调用fun(4)→ 进入fun(4)第一次循环(i=0)→ 打印4→ 调用fun(3)→ 进入fun(3)第一次循环(i=0)→ 打印3→ 调用fun(2)→ 进入fun(2)第一次循环(i=0)→ 打印2→ 调用fun(1)→ 进入fun(1)第一次循环(i=0)→ 打印1→ 调用fun(0)触发终止条件返回
触发n==0后,程序不会直接结束,而是逐层回到上一层函数,继续执行没走完的循环,也就是递归的回溯过程:
- 回到
fun(1)的i=0循环,已经执行完fun(0),i自增到1,进入第二次循环:打印1,调用fun(0)返回 → i=2:打印1→ 直到fun(1)的5次循环全部执行完,输出另外4个1 fun(1)执行完毕,回到fun(2)的i=0循环,i自增到1,进入第二次循环:打印2,调用fun(1)输出5个1→ 重复到fun(2)的5次循环全部执行完fun(2)执行完毕,回到fun(3)的i=0循环,i自增到1,进入第二次循环:打印3,调用fun(2)输出fun(2)的全部内容 → 重复5次循环- 以此类推,逐层向上回溯,直到最上层
fun(5)的5次循环全部执行完毕,整个程序结束
内容的提问来源于stack exchange,提问作者Uttam
相关产品推荐
相关产品推荐

