最近在跟着廖雪峰老师学习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 -...-> B | move 1, A --> B |
move 1, A --> C | move 1, A --> C |
move 1, B -...-> C | move 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 -...-> C | move 1, A --> C | |
move 2, A -...-> B | move 1, A --> B | move 1, A --> B |
move 1, C -...-> B | move 1, C --> B | |
move 1, A --> C | move 1, A --> C | move 1, A --> C |
move 1, B -...-> A | move 1, B --> A | |
move 2, B -...-> C | move 1, B --> C | move 1, B --> C |
move 1, A -...-> C | move 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)