您好,欢迎来到网暖!

当前位置:网暖 » 站长资讯 » 建站基础 » 网络技术 » 文章详细 订阅RssFeed

抽象之汉诺塔问题(Python3)

来源:网络整理 浏览:354次 时间:2022-11-21

汉诺塔问题:

       如图,有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,完成。


抽象:

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


推荐站点

  • 腾讯腾讯

    腾讯网(www.QQ.com)是中国浏览量最大的中文门户网站,是腾讯公司推出的集新闻信息、互动社区、娱乐产品和基础服务为一体的大型综合门户网站。腾讯网服务于全球华人用户,致力成为最具传播力和互动性,权威、主流、时尚的互联网媒体平台。通过强大的实时新闻和全面深入的信息资讯服务,为中国数以亿计的互联网用户提供富有创意的网上新生活。

    www.qq.com
  • 搜狐搜狐

    搜狐网是全球最大的中文门户网站,为用户提供24小时不间断的最新资讯,及搜索、邮件等网络服务。内容包括全球热点事件、突发新闻、时事评论、热播影视剧、体育赛事、行业动态、生活服务信息,以及论坛、博客、微博、我的搜狐等互动空间。

    www.sohu.com
  • 网易网易

    网易是中国领先的互联网技术公司,为用户提供免费邮箱、游戏、搜索引擎服务,开设新闻、娱乐、体育等30多个内容频道,及博客、视频、论坛等互动交流,网聚人的力量。

    www.163.com
  • 新浪新浪

    新浪网为全球用户24小时提供全面及时的中文资讯,内容覆盖国内外突发新闻事件、体坛赛事、娱乐时尚、产业资讯、实用信息等,设有新闻、体育、娱乐、财经、科技、房产、汽车等30多个内容频道,同时开设博客、视频、论坛等自由互动交流空间。

    www.sina.com.cn
  • 百度一下百度一下

    百度一下,你就知道

    www.baidu.com