3,4,5…柱 汉诺塔,递归实现处理
3柱汉诺塔:
【解题思路】
如何把底部最大的一个圆盘拿到最终的柱子,那就是把它分为最大圆盘和除去最大圆盘的圆盘整体,把其他整体移到单独柱子的时候,最大圆盘就可以移动,然后再把其他整体又看作新的移动对象,按照前面方法重复,那这个时候就用到递归
def three(x, a, b, c):
if x == 1:
print(a, '-->', c)
else:
three(x - 1, a, c, b) # x-1个以整体移到b
print(a, '-->', c) # 剩下那个最大的移到c
three(x - 1, b, a, c) # x-1个变成新的问题:如何将x-1个从b移到c.(递归即可)
4柱
【解题思路】
3柱的解题思路已经清楚,4柱也好理解一下,如果按照3柱的方式,也是可以实现,但是浪费一根柱子,效率也太低了,这个时候,现在直接把二分法直接分成两个整体,,有个重点注意的,如果不清楚汉诺塔可能就会忽略,大盘无法放在小盘上,当你成功把上面一部分迁移到一根柱子上面,你会发现这根柱子在下面迁移另外一部分是不能使用的,那4根将会变成3根,这个时候就可以使用3根的解题方式解决,当下面部分迁移完成后,3根柱子又变成4根,那这样可以用上面方式把上面部分迁移到最终位置
def four(x, a, b, c, d):
if x == 1:
print(a, '-->', d)
else:
k = x // 2 # 先将A柱子上分为两部分n-k个盘子 和k个盘子
four(x - k, a, c, d, b) # 将A柱上方n–k个盘子经过C、D柱移至B柱
three(k, a, c, d) # 将A柱所剩的k个盘子经过C柱移至D柱。
four(x - k, b, a, c, d) # 将B柱上的所有盘子经过A、C柱移至D柱
5柱
【解题思路】
5柱这种方式并不是最佳解法,只是个人思维扩展,沿用4柱的解题思路处理,5柱变4柱,然后采用4柱方式处理,以此类推6,7,8…柱都可以采用这方式,有兴趣可以考虑一下最优解法
def fire(x, a, b, c, d, e):
if x == 1:
print(a, '-->', e)
else:
k = x // 2 # 先将A柱子上分为两部分n-k个盘子 和k个盘子
fire(x - k, a, c, d, e, b) # 将A柱上方n–k个盘子经过C、D柱移至B柱
four(k, a, c, d, e) # 将A柱所剩的k个盘子经过C柱移至D柱。
fire(x - k, b, a, c, d, e) # 将B柱上的所有盘子经过A、C柱移至D柱
思维启发:处理复杂个体,找出最简单个体的解决方案,相继把复杂个体分解成多个最简单的个体,,进行实现,虽然它并不是最佳方式,但是永远不会错