C++递归函数执行逻辑:为何递归调用在前时逐行打印1到h个井号?
C++递归draw函数运行逻辑解释
你产生误解的核心原因是搞错了递归调用的执行规则:函数调用其他函数(包括调用自身)时,会先完整执行完被调用函数的全部逻辑,等被调用函数返回后,才会继续执行当前函数调用位置之后的代码,不会因为提前调用了自身就跳过后续的for循环。
我们可以分两种情况拆解执行流程:
情况1:递归调用在for循环前(即你给出的示例代码)
我们以调用draw(3)为例,完整执行顺序如下:
- 进入
draw(3),h不等于0,优先调用draw(2)- 进入
draw(2),h不等于0,优先调用draw(1)- 进入
draw(1),h不等于0,优先调用draw(0)- 进入
draw(0),触发h==0的终止条件,直接return,无任何输出
- 进入
- 回到
draw(1),递归调用完成,执行for循环:h=1,打印1个#后换行
- 进入
- 回到
draw(2),递归调用完成,执行for循环:h=2,打印2个#后换行
- 进入
- 回到
draw(3),递归调用完成,执行for循环:h=3,打印3个#后换行
最终输出就是从1个到h个#的正序效果:
# ## ###
情况2:递归调用移到for循环后
修改后的代码逻辑是先执行打印、再发起递归,还是以draw(3)为例:
- 进入
draw(3),h不等于0,先执行for循环:h=3,打印3个#后换行 - 调用
draw(2)- 进入
draw(2),h不等于0,先执行for循环:h=2,打印2个#后换行 - 调用
draw(1)- 进入
draw(1),h不等于0,先执行for循环:h=1,打印1个#后换行 - 调用
draw(0),触发终止条件直接return draw(1)执行完毕返回
- 进入
draw(2)执行完毕返回
- 进入
draw(3)执行完毕返回
最终输出就是从h个到1个#的倒序效果:
### ## #
内容的提问来源于stack exchange,提问作者Augis
相关产品推荐
相关产品推荐

