汉诺塔——原理讲解+python代码实现

如果比较急的可以点击直接看思路总结
或者点击这里看程序代码

汉诺塔简介:

先来看下什么是汉诺塔
汉诺塔游戏简介

当我们只有一个盘子的时候,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

  1. 第一步要把n-1个盘子从A移动到X,即调用:f(n-1,A,X,B)
  2. 第二步把剩下的唯一 一个在A上的盘子从A移到B
  3. 第三步把刚刚第一步中移到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,"原始","目标","中间") #也可以用其他名字命名三根柱子,切记第三个柱子的作用是中间过渡介质阿阿阿阿阿
从 原始 移动一个盘子到 中间
从 原始 移动一个盘子到 目标
从 中间 移动一个盘子到 目标
从 原始 移动一个盘子到 中间
从 目标 移动一个盘子到 原始
从 目标 移动一个盘子到 中间
从 原始 移动一个盘子到 中间
从 原始 移动一个盘子到 目标
从 中间 移动一个盘子到 目标
从 中间 移动一个盘子到 原始
从 目标 移动一个盘子到 原始
从 中间 移动一个盘子到 目标
从 原始 移动一个盘子到 中间
从 原始 移动一个盘子到 目标
从 中间 移动一个盘子到 目标
发布了18 篇原创文章 · 获赞 29 · 访问量 946

猜你喜欢

转载自blog.csdn.net/weixin_43509127/article/details/104310593