兴趣所在,刚接触c#,目前自学中,课堂中遇到了汉诺塔次数的问题,让用递归的思想解决。刚开始我也是在草稿纸上画来画去,还画错了,后面才弄明白。但是昨天晚上躺下后,我又在想能不能利用整体的思想,简化一下思考路径,自己想出了个思路,原来是早就有的所谓冰箱装大象的方法。不过我还是写下自己的思考方法,巩固一下,顺便发出自己的第一个帖子😁
以三个移动为例,目标就是把1、2、3从A柱全部挪到C柱。其实这里把三个全部从A挪到B的次数是一样的,也就是次数和位置无关,这点是这个整体思路的关键。
![](https://i-blog.csdnimg.cn/blog_migrate/c7a2442fb128cfbc9e9187f74f0923a2.png)
整体思想就是,把第n-1及以上的珠子全部看做一个整体,例子中就是把1、2看做一个整体,所以就变成了解两个珠子的问题。
那么第一步,就是要要把1、2的整体挪到B柱上,那么此时产生的步数为f(2)。
![](https://i-blog.csdnimg.cn/blog_migrate/287f3d0cb714d38435b5561838afefa0.png)
第二步,把1挪到C上,此时步数为1步。总步数变为f(2)+1。
![](https://i-blog.csdnimg.cn/blog_migrate/d1e7520b5d0bee47bcb437b96c51ee9a.png)
第三步,把1、2整体再挪到C上。根据规则,因为1是最大的,只要1到位后,即可以把1看做成基座的一部分了,此时的问题就相当于把1、2从B挪到C了。前面说过,位置和次数无关,那么要实现1、2从B到C,步数也是f(2)。此时,总步数为f(2)+1+f(2),整理后为f(3)=2*f(2)+1。
![](https://i-blog.csdnimg.cn/blog_migrate/44c24d3e422b4904d60b52f003a1f89c.png)
同理可得,
f(4)=f(3)+1+f(3)=2*f(3)+1
f(5)=f(4)+1+f(4)=2*f(4)+1
f(n)=2*f(n-1)+1
道阻且坚,继续加油。