汉诺塔问题:
如图,有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代码:
代码简要说明:
n->石盘的数量,a,b,c->3根被命名的柱子
如果n=1,只有1个石盘,从A借助B移动到C;
否则,将n-1的石盘从A移动到C,将第n个石盘(最大的那1个石盘)从A移动到C,将B上n-1个石盘从B借助A移动到C,完成。
抽象:
我们将一个问题从假设到分离,到关键步骤提取,然后用程序模拟出问题的实现路径,这就是抽象的魅力。大家可以抽象一下8皇后问题。