抽象之汉诺塔问题(Python3)

汉诺塔问题:
在这里插入图片描述

如图,有3根柱子,柱子A上有若干自上而下、由小到大的石盘,每次只允许移动1个石盘,石盘可以在ABC柱子上随意移动,移动过程中小的石盘必须在大的石盘上面,如何将A上的石盘按原样全部移动到C上。

Python3程序模拟:

要用python3程序模拟这个移动步骤,首先要将这个问题分离-提取,也就是将问题的关键步骤抽象出来,好比我们的等差等比数列的求和公式。

假设A上只有1个石盘,那只需将石盘从A直接移动到C。

假设A上只有2个石盘,需要将小的石盘从A移动到B,然后将大的石盘从A移动到C,然后将小的石盘从B移动到C。

。。。。。。。

假设A上有64个石盘,我们无法想象,只能将问题逐步抽象,站到一个更高一些的角度去思考:

因为每次移动,要求小的石盘必须在大的石盘上面,所以如果想将A上的石盘全部移动到C上,我们只能将A上的前63个石盘移动到B上,然后将A上最大的石盘移动到C上(这里和A上只有1个石盘是一样样的);

现在A上没有石盘了,B上有63个石盘,C上有一个最大的石盘,现在C上的石盘可以扔掉了,最大的石盘已经成功转移,且任何其他石盘都比最大的石盘小,所以可以忽略不计了,问题转变为如何将B上的63个石盘,借助A,全部移动到C上(又回到了A上有64个石盘的命题);

Python3代码:

def f_move(n, a, b, c):
   if n == 1:
       print('move:',a, '-->', c)
    else:
       f_move(n-1, a, c, b)
       f_move(1, a, b, c)
       f_move(n-1, b, a, c)
#测试一下
f_move(3, 'a', 'b', 'c')

代码简要说明:

n->石盘的数量,a,b,c->3根被命名的柱子

如果n=1,只有1个石盘,从A借助B移动到C;

否则,将n-1的石盘从A移动到B,将第n个石盘(最大的那1个石盘)从A移动到C,将B上n-1个石盘从B借助A移动到C,完成。

抽象: 我们将一个问题从假设到分离,到关键步骤提取,然后用程序模拟出问题的实现路径,这就是抽象的魅力。

喜欢我也可以关注微信公众号:码农小麦。

原创文章 17 获赞 13 访问量 7624

猜你喜欢

转载自blog.csdn.net/weixin_43275277/article/details/88546247
今日推荐