** Python小白,刚开始学习Python,把自己学习的一些想记录的东西记录一下,有错误的话欢迎大家指正,希望大家一起学习,共同进步。**
# 汉诺塔递归实现:def han_nuo_ta(n, A, B, C):
# 1.一次只能移动一个盘子。
# 2.大盘子在下小盘子在上。
# n 代表塔上盘子数。
# 函数定义中的形参A,B,C 只代表塔的顺序使用。
# A 代表第一个塔。 开始时盘子所在塔。
# B 代表第二个塔。 被用来当做跳板进行移动的塔。
# C 代表第三个塔。 目标塔(盘子最后移动的目标)
# 将所有盘子移动到C上去
"""
当 n = 1时:
1. 只有一个盘子,所以只要直接从A塔移到C塔上去:A --> C
当 n = 2时:
# 通过B塔进行移动。
1. 先从A塔移动一个到B塔上: A --> B
2. 直接将第二个盘子从A塔移动到C塔: A --> C
3. 直接将B塔上的盘子移动到C塔: B --> C
当 n >= 1时(n = 2时也适用,为了方便理解所以将n = 2的情况详细写出。):
1. 先利用C塔将n-1个盘子移动到B塔,此过程通过递归实现:
def han_nuo_ta(n, A, B, C):
...
#第一步
han_nuo_ta(n-1, A, C, B)
2. n-1个盘子已经从A塔通过C塔移动到了B塔,将A塔上最后一个最大的盘子直接移动到C塔:A --> C 实现:
def han_nuo_ta(n, A, B, C):
...
#第一步
han_nuo_ta(n-1, A, C, B)
#第二步
print(A, "-->", C)
3. 将B塔上剩下的n-1个盘子通过A塔移动到C塔,利用递归实现:
def han_nuo_ta(n, A, B, C):
...
#第一步
han_nuo_ta(n-1, A, C, B)
#第二步
print(A, "-->", C)
#第三步
han_nuo_ta(n-1, B, A, C)
# 第三步可能比较难理解,可以把第三步当做一个重新开始的汉诺塔,
因为已经移动了一个盘子到C,所以n = n-1,n-1个盘子在B上,可以理解为B is A,A is B,C还是C。
记得自己画图学习哟,这样更容易理解
"""
def han_nuo_ta(n, A, B, C):
# 当盘子数为1的时候。
if n == 1:
print(A, "-->", C)
return None
# 当盘子数为2的时候。
if n == 2:
print(A, "-->", B)
print(A, "-->", C)
print(B, "-->", C)
return None
han_nuo_ta(n - 1, A, C, B)
print(A, "-->", C)
han_nuo_ta(n - 1, B, A, C)
n = 1
han_nuo_ta(n, A, B, C)
print("*" * 20)
n = 2
han_nuo_ta(n, A, B, C)
print("*" * 20)
n = 3
han_nuo_ta(n, A, B, C)
print("*" * 20)
我们来看一看输出的样子:
# n = 4时呢?
n = 4
han_nuo_ta(n, A, B, C)
print("*" * 20)
通过自己的验证可以发现以上的输出都是符合汉诺塔的规则的。
学习之路,任重道远,加油。