Python学习--- 递归: 汉诺塔学习

** 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)

在这里插入图片描述
通过自己的验证可以发现以上的输出都是符合汉诺塔的规则的。

学习之路,任重道远,加油。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值