现在在学数据结构,在递归这一节中有一个典型的问题:汉诺塔问题,在学习的时候怎么想也想不懂,最后画了张图终于搞明白这个代码是如何运作的,以下便是我个人对于汉诺塔的理解。
首先,课本上的代码是这么写的
void Hanoi(int n,char x,char y,char z){
if(n==1)
printf("将第%d个盘片从%c移动到%c\n",n,x,z);
else
{
Hanoi(n-1,x,z,y);
printf("将第%d个盘片从%c移动到%c\n",n,x,z);
Hanoi(n-1,y,x,z);
}
}
我们假设一开始传入的是有3个盘,xyz分别是A B C柱,则运行起来可以画成下面这张图
字写的不是那么好看。总的来说汉诺塔问题实际上只有三大步,只不过在这三大步里第一和最后一步还会在细分为三大步,中间的第二步会直接打印输出。当所谓的“大步”不能再往下分时(即进行到就剩一个盘片时),也会打印输出。在上面这张图中,向右指的箭头以及最后一排
H(1, , ,)那些节点,就是打印输出的点。
汉诺塔代码逻辑确实不太好理解,最初的设计者确实很厉害。以后遇到这种靠纯粹的“想”理解不了的代码,还是建议画图去理解。