[python练习] 汉诺塔

最近在跟着廖雪峰老师学习python3(https://www.liaoxuefeng.com),准备记录一下写的练习题,小白入门可能写的有欠考虑的地方,不过慢慢加油啦。这是第一篇,希望能坚持。

相关知识点:递归函数

请编写move(n,a,b,c)函数,它接收参数n,表示3个柱子A、B、C中第1个柱子A的盘子数量,然后打印出把所有盘子从A借助B移动到C的方法。

分析:

1.具体

1) n=1 即柱子A上只有一个盘子,只要一步

A -> C

2) n=2 即柱子A上有两个盘子,先把上面的盘子临时放到B,再把下面的盘子挪到C,最后把B上的盘子挪到C

A -> B

A -> C

B -> C

3) n=3 即柱子A上有三个盘子,用递归的思想看,先想办法把小、中盘子临时放到B,再把大盘在挪到C,在把小、中盘子挪到。这里将小、中盘子看做一个整体,所以在此之前要解决如果把小中盘子通过B从A挪到C,其实就是n=2的情况了

A -> C

A -> B

C -> B

A -> C

B -> A

B -> C

A -> C

 

2.抽象

以此类推,如果有n个盘子,问题可以转换为三步

1) 把n-1个盘子从A挪到B (抽象的,同理可以分解为三步)

2) 把最后一个盘子从A挪到C (具体直观的,仅此一步)

3) 把剩下的n-1个盘子从B挪到C (抽象的,同理可以分解为三步)

如果n=2,调用的函数是move(2,'A','B','C')

步骤1) 仅一步 move(1,'A','C','B')

步骤2) 是一步 move(1,'A','B','C')

步骤3) 仅一步 move(2,'B','A','C')

抽象步骤具体步骤
move 1, A -...-> Bmove 1, A --> B
move 1, A --> Cmove 1, A --> C
move 1, B -...-> Cmove 1, B --> C

如果n=3,调用的函数是move(3,'A','B','C')

步骤1)  有多步move(2,'A','C','B')

步骤2) 是一步 move(1,'A','B','C')

步骤3) 有多步 move(2,'B','A','C')

抽象步骤抽象步骤具体步骤
 move 1, A -...-> Cmove 1, A --> C
move 2, A -...-> Bmove 1, A --> Bmove 1, A --> B
 move 1, C -...-> Bmove 1, C --> B
move 1, A --> Cmove 1, A --> Cmove 1, A --> C
 move 1, B -...-> Amove 1, B --> A
move 2, B -...-> Cmove 1, B --> Cmove 1, B --> C
 move 1, A -...-> Cmove 1, A --> C

n个盘子同理,调用的函数是move(n,'A','B','C')

步骤1)  有多步move(n-1,'A','C','B')

步骤2) 是一步 move(1,'A','B','C')

步骤3) 有多步 move(n-1,'B','A','C')

所有的抽象步骤,最后都转换为1个盘子的问题为止,即n=1。这里可以用一个判断,if 中是终点n=1的情况,else 中是递归。

 

代码实现:

# -*- coding: utf-8 -*-
def move(n, a, b, c):
	if n == 1:
		print(a, '-->', c)
	else:
		move(n-1, a, c, b)
		move(1, a, b, c)
		move(n-1, b, a, c)

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值