ps:代码为本人从其他平台学习后在本文章中做复写复习。
汉诺塔问题是递归的经典问题。
假设有三根柱子A,B,C,A柱子上有若干圆盘自上而下从小到大排列堆叠,需要把A柱子上的圆盘全部移动到C柱子上,在此过程中圆盘只能被放在比自身大的圆盘上方,如何移动圆盘才能把圆盘全部转移到C柱子上?转移过程中需要移动多少步?有没有最优的解决方案?
以下代码输出结果为每一步的移动过程。跟栈有点类似?
本人主语言目前为python,后文均为该语言。
def hanota(n, a, b, c):
if n > 0:
hanota(n-1, a, c, b)
print("move from %s to %s" %(a, c))
hanota(n-1, b, a, c)
如果不输出每步过程,只是把数据转移的话:
class Solution:
def hanota(self, A, B, C):
n = len(A)
self.move(n, A, B, C)
def move(self, n, A, B, C):
if n == 1:
C.append(A[-1])
A.pop()
return
else:
if n > 0:
self.move(n-1, A, C, B)
C.append(A[-1])
A.pop()
self.move(n-1, B, A, C)
该过程中A,B,C可以为列表,A中数据通过递归调用自身转移到C;另外创建了类,self调用自身函数。
该问题具体化思考,A柱子只有一个盘子的时候,直接移动;有两个盘子的时候,是小盘子B大盘子C小盘子C的过程。3个,n个呢?
n个时,这时可以抽象成
把n-1个盘子经过C移动到B,
第n个盘子移动到C,
再把n-1个盘子从B经过A移动到C。
理解这个问题,初学者来说需要多画画,多从简单情况开始想,多看几遍教程,可能才会比较理解一点。