小白日更第六天->五行代码解决汉诺塔问题

## 挑战全网代码最少汉诺塔问题

汉诺塔问题的描述我就不再说了吧~点进来看这篇文章的小伙伴应该已经对汉诺塔问题有了自己的理解,我最近也是在复习之余,想搞一搞算法,其实我觉得算法的学习终究还是思想,我们学的是思想,不是就为了看代码,🆗,代码你看懂了,这道题就会做了,下到题换个数你又不会了,所以学习那些前辈们的好的算法的思想真的很重要,很多时候我们再做算法题的时候,只要我们有了思路,那我们其实就已经完成一半了,剩下的就是代码实现了,当然我们平时不能只看不敲,只有我们动手敲,印象才会更深刻。话不多说,上代码!!!
在这里插入图片描述

运行结果如下:
在这里插入图片描述
抛去我写的注释,一共五行代码解决汉诺塔问题。更多的演示我就不在这里展示了,小伙伴们可以自行尝试~
小伙伴们现在停下来思考,根据我的代码注释,看看自己能不能想得通~

现在你的表情是不是现在这样子~
在这里插入图片描述
下面我来解释下我的思路:
1、首先这道题用的是分治思想+递归实现

2、我们考虑这道题的时候无非有两种情况,第一种A柱子上只有一个盘子,那好我们直接将盘子从A移动到C就可以了。 第二种情况,盘子的数目大于一,那我们现在是不是可以把最底下的盘子当作一个整体,把剩余的盘子当作一个整体。

3、现在我们不管盘子的数目,我们已经把它分为两个整体了,然后我们把上面的整体移动到B柱子,然后把下面的盘子移动到C柱子,其实很好理解,我们最终是不是要把所有盘子都移动到C柱子,现在已经完成将最底下的盘子移动到C柱子,在这期间我们的B柱子当成是最终柱子使用A和C柱子进行过渡。

4、现在我们要做的是把B柱子上的盘子移动到C柱子,这里对应的参数就会位置变化,第一个参数始终是盘子最开始所在的位置,第二个参数是用来过渡的柱子,最后一个参数是最终我们要将所有的盘子都放到的这个柱子。

5、这也就不难理解了,我们通过递归会把我们第一次拆分的两个整体会进行递归从而再次拆分,从而实现达到最终我们想要的效果。

解释到这里可能小伙伴们还不是很懂,很大的原因是我没有表达清楚。我建议大家从nums等于1开始,nums的值依次加一,慢慢理解体会递归的精髓。

我还是想说,其实代码不重要,重要的是思想,这道题可能帮不了你什么,只是想带小伙伴们体会下分治的思想以及递归的精髓。

有什么问题欢迎评论区留言,文章中有错误的地方,希望小伙伴们批评指正~~

最后说明一下代码是我根据bilibili尚硅谷韩老师的数据结构与算法的视频讲解来跟着敲的,只是觉得这个确实不错,然后写一篇文章,加上自己的一些理解来分享给大家~

视频地址添加链接描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值