求大佬解释一下这个基于C语言写的汉诺塔程序的一个步骤,谢谢!

#include<stdio.h>
/*定义一个Hanoi函数以完成汉诺塔递归*/
/*n表示64个环*/
/*A表示起始杆*/
/*B表示辅助杆*/
/*C表示终点杆*/
void hanoi(int n, char A, char B, char C)
{
void hanoi(int,char, char, char);
void move(char, char);
if (n == 1)
{
move(A, C);
}
else
{
hanoi(n - 1, A, C, B);
move(A, C);
hanoi(n - 1, B, A, C); <-------就是这个地方
}
}
/*定义一个打印步骤的函数*/
/*x表示起点*/
/*y表示终点*/
void move(char x, char y)
{
printf("%c-->%c\n", x, y);
}
int main()
{
char a,b,c;
void hanoi(int n, char A, char B, char C);
void move(char x, char y);
printf("5个盘需要如下步骤:\n");
hanoi(5,'a','b','c');
}
我用vs17单步调试时,在这两个图这里给的n值蒙圈了,不知道为什么n值从前一步的1到了hanoi(n - 1, B, A, C);这一步时,n就变成2了。
我纳闷的是不应该是n=n-1=1-1=0吗?为啥就变2了?
求大佬指点迷津!感激不尽!



我将开始的递归部分分解了、不知解释清楚没有。每层递归里n的值是不变的、为什么是2请看图。

追问

老哥,你这图我看不清啊···

追答

嗯、太大有点模糊了。就是想解释每层递归n的值在堆栈里、同一层用到的n是一样的。

白天照一下

追问

请问,是不是可以理解为返回时的n=2是原来在没返回前的一个固定的状态,只是返回时刚好经过了这个地方一样?

追答

嗯、是的。不会是你理解的=0

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-05-31
n在代码中实际表达了两种意思,一种表示当前正在移动的盘号(对应move函数),一种是要移动几个盘子(对应hanoi函数)。建议你修正一下move函数,添加参数n,以便在printf里输出当前移动的是哪一个盘本回答被网友采纳
第2个回答  2019-05-30
如果没有尾递归和尾递归优化,递归结束时会一层层地往回走。
4->3->2->1->2->3->4这样。
底下的“调用堆栈”可以看到栈帧的情况。追问

请问一下这是一般性的特点还是只有在特定的情况下,递归结束后会一层层往回走啊?

追答

21行把n-1传进去了,如果不往回走,怎么执行22行的代码?