汉诺塔函数执行顺序疑问:为何输出起始为disk 1?
汉诺塔递归代码输出顺序解析
你搞反了递归的执行顺序——这段代码里,打印操作夹在两次递归调用中间,程序会先把所有上层的递归调用跑完,才会执行当前n对应的打印语句。
拿n=4的调用举例:
- 调用
towersOfHanoi(4, "A", "C", "B")时,第一步是执行towersOfHanoi(3, "A", "B", "C"),此时不会打印任何内容,而是继续往更深的递归层级走。 - 进入
towersOfHanoi(3, "A", "B", "C"),又先执行towersOfHanoi(2, "A", "C", "B"),仍然不打印。 - 进入
towersOfHanoi(2, "A", "C", "B"),先执行towersOfHanoi(1, "A", "B", "C"),继续递归。 - 进入
towersOfHanoi(1, "A", "B", "C"),先执行towersOfHanoi(0, "A", "C", "B"),这个调用因为n=0直接返回。 - 回到
towersOfHanoi(1, "A", "B", "C"),终于执行打印语句,输出Move disk 1 from rod A to rod B.——这就是你看到的第一行日志。 - 之后程序才会依次回溯执行上层的打印:disk2、disk1、disk3、disk1、disk2、disk1,最后才会打印disk4的移动操作。
简单说:递归是先“钻”到最小的圆盘(disk1),完成它的移动逻辑后,才会往上处理更大的圆盘。disk4的移动要等上面3个圆盘都从A移到B之后才会执行,所以它的打印是倒数第二行。
附上你的代码:
function towersOfHanoi(n,f,t,a) { if (n==0){ return; } towersOfHanoi(n-1, f, a, t); console.log("Move disk "+ n + " from rod " + f +" to rod "+ t +".") towersOfHanoi(n-1, a, t, f); } let N = 4; towersOfHanoi(N,"A","C","B");
内容的提问来源于stack exchange,提问作者bamb1
相关产品推荐
相关产品推荐

