汉诺塔C语言递归代码输出C为源柱移动步骤的逻辑疑问
问题原因拆解
你之所以会有这个疑问,是因为忽略了递归调用的参数是随每一层函数的形参动态变化的,并不是一直沿用main函数里传入的初始值,实际上确实存在将'C'作为source_peg入参的调用,具体调用流程如下:
完整调用栈推导(输入num=3时)
- 主函数调用
move_disks(3, 'A', 'B', 'C'),对应形参:num=3,source_peg='A',aux_peg='B',to_peg='C'- 因为num≠1,优先执行第一个递归逻辑:将num-1个盘子从源柱借目标柱移到辅助柱,所以调用
move_disks(2, 'A', 'C', 'B')
- 因为num≠1,优先执行第一个递归逻辑:将num-1个盘子从源柱借目标柱移到辅助柱,所以调用
- 进入
move_disks(2, 'A', 'C', 'B'),对应形参:num=2,source_peg='A',aux_peg='C',to_peg='B'- num≠1,先执行第一个递归调用
move_disks(1, 'A', 'B', 'C')- 该调用num=1,直接输出第一行结果:
Move disk 1 from peg A to peg C.,返回上层
- 该调用num=1,直接输出第一行结果:
- 打印当前层num=2的移动:
Move disk 2 from peg A to peg B.(第二行输出) - 执行第二个递归逻辑:将num-1个盘子从辅助柱借源柱移到目标柱,对应调用参数为
move_disks(num-1, aux_peg, source_peg, to_peg),当前层的aux_peg是'C',所以实际调用为move_disks(1, 'C', 'A', 'B')- 该调用num=1,入参
source_peg='C'、to_peg='B',直接输出你疑惑的第三行结果:Move disk 1 from peg C to peg B.,返回上层
- 该调用num=1,入参
- num≠1,先执行第一个递归调用
- 回到初始的
move_disks(3, 'A', 'B', 'C'),继续执行后续逻辑即可生成剩下的输出。
内容的提问来源于stack exchange,提问作者piyush kumar singh
相关产品推荐
相关产品推荐

