带std::vector的C++双重递归函数执行流程分步解析请求
双重递归函数F的执行过程解析
先明确几个关键前提:
b是引用传递:所有递归调用共享同一个变量值,每次进入函数(未触发终止条件时)都会先执行b -=1- 递归调用顺序:C++中函数参数求值顺序为从左到右,因此
F(v,a-1,b) + F(v,a,b)会先执行左侧递归,再执行右侧递归 - 向量元素添加时机:
v.push_back(a)只会在左右递归都执行完毕、计算出当前a的值后才会执行,因此vector中的元素是按照递归函数的返回顺序(从最深层到上层)添加的 - 终止条件:当
a<=0或b<=2时,直接返回当前a的值
初始状态
- 向量
v为空 - 变量
b=7 - 调用
F(v, 15, b)
步骤1:进入F(a=15, b=7)
- 不满足终止条件(
15>0且7>2),执行b -=1,此时b=6 - 先执行左侧递归:
F(v, 14, 6)
步骤2:进入F(a=14, b=6)
- 不满足终止条件,执行
b -=1,此时b=5 - 先执行左侧递归:
F(v, 13, 5)
步骤3:进入F(a=13, b=5)
- 不满足终止条件,执行
b -=1,此时b=4 - 先执行左侧递归:
F(v, 12, 4)
步骤4:进入F(a=12, b=4)
- 不满足终止条件,执行
b -=1,此时b=3 - 先执行左侧递归:
F(v, 11, 3)
步骤5:进入F(a=11, b=3)
- 不满足终止条件,执行
b -=1,此时b=2 - 执行左侧递归:
F(v, 10, 2)→ 触发终止条件(b<=2),返回10 - 执行右侧递归:
F(v, 11, 2)→ 触发终止条件,返回11 - 计算
a = 10 + 11 = 21,执行v.push_back(21),此时v=[21] - 返回
21,回到步骤4
回到步骤4:F(a=12, b=2)
- 左侧递归返回
21,执行右侧递归:F(v, 12, 2)→ 触发终止条件,返回12 - 计算
a = 21 + 12 = 33,执行v.push_back(33),此时v=[21, 33] - 返回
33,回到步骤3
回到步骤3:F(a=13, b=2)
- 左侧递归返回
33,执行右侧递归:F(v, 13, 2)→ 触发终止条件,返回13 - 计算
a = 33 + 13 = 46,执行v.push_back(46),此时v=[21, 33, 46] - 返回
46,回到步骤2
回到步骤2:F(a=14, b=2)
- 左侧递归返回
46,执行右侧递归:F(v, 14, 2)→ 触发终止条件,返回14 - 计算
a = 46 + 14 = 60,执行v.push_back(60),此时v=[21, 33, 46, 60] - 返回
60,回到步骤1
回到步骤1:F(a=15, b=2)
- 左侧递归返回
60,执行右侧递归:F(v, 15, 2)→ 触发终止条件,返回15 - 计算
a = 60 + 15 = 75,执行v.push_back(75),此时v=[21, 33, 46, 60, 75] - 返回
75,递归结束
最终向量v中的元素依次输出就是21 33 46 60 75,与程序输出一致。
内容的提问来源于stack exchange,提问作者codproe
相关产品推荐
相关产品推荐

