如何更好的理解汉诺塔问题

        现在在学数据结构,在递归这一节中有一个典型的问题:汉诺塔问题,在学习的时候怎么想也想不懂,最后画了张图终于搞明白这个代码是如何运作的,以下便是我个人对于汉诺塔的理解。

        首先,课本上的代码是这么写的

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, , ,)那些节点,就是打印输出的点。

        汉诺塔代码逻辑确实不太好理解,最初的设计者确实很厉害。以后遇到这种靠纯粹的“想”理解不了的代码,还是建议画图去理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值