汉诺塔简介:
先来看下什么是汉诺塔
当我们只有一个盘子的时候,so easy,直接把盘子从A移到B就可以了。好的我们已经掌握了一个盘子的挪动方法。既然会挪动一个盘子,那n个盘子我们也就会挪动了。
当我们在写递归函数时,要有一个坚定的信念——相信这个函数一定可以完成它的任务。 这是我今天会一直强调的一句话。
来看一下两个盘子的情况:
大家可以先自己试一下如何挪动
我想应该没有什么方法能比三步更少的完成两个盘子的挪动了吧。(如果有的话欢迎留言hhh)
现在我们已经掌握了两个盘子的挪法。
当n=3,即盘子数变为3的时候我们应该怎么办呢?
我们来看,想要用最少的次数把3个盘子从A移到B。
首先是不是该用最少的次数把n - 1 = 2个盘子从A移到X。
而这一步我们刚刚已经实现了。不信你点这回上去看看
只不过刚刚是把2个盘子从A移到B,现在是把两个盘子从A移到X。
具体怎么实现先别急,先把原理看懂。
完成这步后我们再把c从A移到B。
最后再使用那招用最少的次数把2个盘子从A移到X,不会的话点回上去看看。只不过这次是把两个盘子从X移到了B。这样,三个盘子的移动就大功告成了。
以此类推,我们会移2个盘子,会移3个盘子,会移4个盘子,就会移动n个盘子。
第一步:n-1个盘子从原始地A移到介质X。
第二步:剩下那个盘子从原始地A移到目的地B。
第三步:n-1个盘子从介质X移到目的地B。
首先一定要记住:第三个参数,也就是X,是起过度作用的,是个中间介质,只有通过X,A才能把所有盘子移到B上。
还要记住:当我们在写递归函数时,要有一个坚定的信念——相信这个函数一定可以完成它的任务。
函数 f(n,A,B,X) 表示将n个盘子从A移到B
- 第一步要把n-1个盘子从A移动到X,即调用:f(n-1,A,X,B)
- 第二步把剩下的唯一 一个在A上的盘子从A移到B
- 第三步把刚刚第一步中移到X上的n-1个盘子从X移到B,即调用:f(n-1,X,B,A)
做完了吗?并没有做完
递归出口:
当n = 1的时候:把盘子从A移到B
PS.第一次写博客讲题…不知道讲清楚没有,欢迎大家给我提建议~
所以最终的代码是这样的:def f(n,A,B,X):
if n == 1:
print("从",A,"移动一个盘子到",B)
else:
f(n-1,A,X,B) #把n-1个盘子从A移动到X
print("从",A,"移动一个盘子到",B) #把剩下的唯一 一个在A上的盘子从A移到B
f(n-1,X,B,A) #把刚刚第一步中移到X上的n-1个盘子从X移到B
f(3,"A","B","X") #来试一下3个盘子的时候的情况。
从 A 移动一个盘子到 B
从 A 移动一个盘子到 X
从 B 移动一个盘子到 X
从 A 移动一个盘子到 B
从 X 移动一个盘子到 A
从 X 移动一个盘子到 B
从 A 移动一个盘子到 B
f(4,"原始","目标","中间") #也可以用其他名字命名三根柱子,切记第三个柱子的作用是中间过渡介质阿阿阿阿阿
从 原始 移动一个盘子到 中间
从 原始 移动一个盘子到 目标
从 中间 移动一个盘子到 目标
从 原始 移动一个盘子到 中间
从 目标 移动一个盘子到 原始
从 目标 移动一个盘子到 中间
从 原始 移动一个盘子到 中间
从 原始 移动一个盘子到 目标
从 中间 移动一个盘子到 目标
从 中间 移动一个盘子到 原始
从 目标 移动一个盘子到 原始
从 中间 移动一个盘子到 目标
从 原始 移动一个盘子到 中间
从 原始 移动一个盘子到 目标
从 中间 移动一个盘子到 目标