Swift趣味案例之汉诺塔

【问题描述】
    有一个梵塔叫汉诺塔,汉诺塔上有三根柱子A、B和C,柱子A上有若干个圆盘,所有圆盘大小不等,且小的在上大的在下,如下图所示:

将柱子A上的所有圆盘借助柱子B移动到柱子C上,移动的过程中每次只能移动一个圆盘,移动后仍然是小的在上大的在下,如下图所示:

求所有圆盘的移动过程。

【设计思路】 

当柱子A有1个圆盘时,只需要将圆盘从柱子A移动到柱子C。

当柱子A有2个圆盘时,先将柱子A上面的圆盘从柱子A移动到柱子B,再将柱子A下面的圆盘从柱子A移动到柱子C,最后将柱子B的圆盘从柱子B移动到柱子C。

当柱子A有3个圆盘时,先将柱子A上面的两个圆盘从柱子A借助柱子C移动到柱子B,然后将柱子A最下面的圆盘从柱子A移动到柱子C,最后将柱子B的两个圆盘从柱子B借助柱子A移动到柱子C。

一般地,当柱子A有n个圆盘时,从上到下依次编号为1, 2, 3, ......, n,先将柱子A上面编号为1至n - 1的圆盘从柱子A借助柱子C移动到柱子B,然后将柱子A最下面编号为n的圆盘从柱子A移动到柱子C,最后将柱子B的n - 1个圆盘从柱子B借助柱子A移动到柱子C。

所求的问题是:将柱子A的n个圆盘借助柱子B移动到柱子C。结合上面的一般性步骤,很容易想到使用递归。假设递归函数playHanoiTower(n, A, B, C)用于将n个圆盘从柱子A借助柱子B移动到柱子C,函数move(n, A, C)用于将编号为n的圆盘从柱子A移动到柱子C,则上面的一般性步骤可以表示为:

1. 当n = 1时,调用move(1, A, C),将圆盘从柱子A移动到柱子C。

2. 当n > 1时,

1) 调用playHanoiTower(n - 1, A,C, B),将柱子A上面编号为1至n - 1的圆盘从柱子A借助柱子C移动到柱子B;

2) 调用move(n, A, C),将柱子A上编号为n的圆盘从柱子A移动到柱子C;

3) 调用playHanoiTower(n - 1, B, A, C),将柱子B的n - 1个圆盘从柱子B借助柱子A移动到柱子C。

【Swift编程实现】 

var count = 1

// 将编号为n的圆盘从柱子from移动到柱子to

func move(n: Int, from: Character, to: Character) {

print("第\(count)步:移动\(n)号圆盘,\(from)--->\(to)")

count += 1

}

// 将n个圆盘从柱子from借助柱子dependOn移动到柱子to

func playHanoiTower(n: Int, from: Character, dependOn: Character, to: Character) {

// 只有一个编号为1的圆盘

ifn == 1 {

// 将编号为1的圆盘从柱子from移动到柱子to

move(n: 1, from: from, to: to)

} else {

// 将最上面的n - 1个圆盘从柱子from借助柱子to移动到柱子dependOn

playHanoiTower(n: n - 1, from: from,dependOn: to, to: dependOn)

// 将编号为n的圆盘从柱子from移动到柱子to

move(n: n, from: from, to: to)

// 将最上面的n - 1个圆盘从柱子dependOn借助柱子from移动到柱子to

playHanoiTower(n: n - 1, from: dependOn,dependOn: from, to: to)

}

}

playHanoiTower(n: 5, from: Character("A"), dependOn: Character("B"), to: Character("C"))

【运行结果】

第1步:移动1号圆盘,A--->C

第2步:移动2号圆盘,A--->B

第3步:移动1号圆盘,C--->B

第4步:移动3号圆盘,A--->C

第5步:移动1号圆盘,B--->A

第6步:移动2号圆盘,B--->C

第7步:移动1号圆盘,A--->C

第8步:移动4号圆盘,A--->B

第9步:移动1号圆盘,C--->B

第10步:移动2号圆盘,C--->A

第11步:移动1号圆盘,B--->A

第12步:移动3号圆盘,C--->B

第13步:移动1号圆盘,A--->C

第14步:移动2号圆盘,A--->B

第15步:移动1号圆盘,C--->B

第16步:移动5号圆盘,A--->C

第17步:移动1号圆盘,B--->A

第18步:移动2号圆盘,B--->C

第19步:移动1号圆盘,A--->C

第20步:移动3号圆盘,B--->A

第21步:移动1号圆盘,C--->B

第22步:移动2号圆盘,C--->A

第23步:移动1号圆盘,B--->A

第24步:移动4号圆盘,B--->C

第25步:移动1号圆盘,A--->C

第26步:移动2号圆盘,A--->B

第27步:移动1号圆盘,C--->B

第28步:移动3号圆盘,A--->C

第29步:移动1号圆盘,B--->A

第30步:移动2号圆盘,B--->C

第31步:移动1号圆盘,A--->C

更多Swift趣味案例,请见51CTO学院视频:《超哥视频讲堂之案例式彻底征服Swift(第2季:趣味案例篇)》

时间: 2024-08-25 06:13:22

Swift趣味案例之汉诺塔的相关文章

汉诺塔的递归算法与解析

从左到右 A  B  C 柱 大盘子在下, 小盘子在上, 借助B柱将所有盘子从A柱移动到C柱, 期间只有一个原则: 大盘子只能在小盘子的下面. 如果有3个盘子, 大中小号, 越小的越在上面, 从上面给盘子按顺序编号 1(小),2(中),3(大), 后面的原理解析引用这里的编号. 小时候玩过这个游戏, 基本上玩到第7个,第8个就很没有耐心玩了,并且操作的动作都几乎相同觉得无聊.  后来学习编程, 认识到递归, 用递归解决汉诺塔的算法也是我除了简单的排序算法后学习到的第一种算法. 至于递归,简单来说

汉诺塔递归

#一日一词# 今天在学习Python的时候,遇到了递归问题,案例呢就是经典的汉诺塔游戏,表示虽然以前就接触过这游戏,解起来也很容易,不过放在编程里,几行的代码可够我手推了一个多小时.╭∩╮(︶︿︶)╭∩╮ 当然也是感受到了搞清楚一个(我认为的)难题的乐趣,心情大好,买条裤子. (表示从晚上一直整理到第二天,电脑没电所以今早发,生日与学习紧密结合)? 首先说下汉诺塔游戏,如下图,需要利用中间的柱子将左边的所有圆盘移动到最右边的柱子上,且和原来的大小上下顺序一致,移动过程中保证大盘永远在小盘下面.

汉诺塔递归算法理解及实现

汉诺塔:(Hanoi)是一种玩具,如图![这里写图片描述] (http://img.blog.csdn.net/20150430225337439) 从左到右 A B C 柱 大盘子在下, 小盘子在上, 借助B柱将所有盘子从A柱移动到C柱, 期间只有一个原则: 大盘子只能在小盘子的下面. 问题理解与描述: 1.问题的理解与描述 问题的形式化表示为: 输入:圆盘数n,3根细杆-- 源杆A.过渡杆B和目标杆C. 输出:圆盘从源杆移动到目标杆过程的最少步骤序列. 2.算法的伪代码: HANOI(n,

hdu 1207 汉诺塔II (DP+递推)

汉诺塔II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4529    Accepted Submission(s): 2231 Problem Description 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往

从汉诺塔问题来看“递归”本质

汉诺塔问题 大二上数据结构课,老师在讲解"栈与递归的实现"时,引入了汉诺塔的问题,使用递归来解决n个盘在(x,y,z)轴上移动. 例如下面的动图(图片出自于汉诺塔算法详解之C++): 三个盘的情况: 四个盘的情况: 如果是5个.6个.7个....,该如何移动呢? 于是,老师给了一段经典的递归代码: void hanoi(int n,char x,char y,char z){ if(n == 1) move(x,1,z); else{ hanoi(n-1,x,z,y); move(x,

bzoj1019: [SHOI2008]汉诺塔(dp)

1019: [SHOI2008]汉诺塔 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1739  Solved: 1062[Submit][Status][Discuss] Description 汉诺塔由三根柱子(分别用A B C表示)和n个大小互不相同的空心盘子组成.一开始n个盘子都摞在柱子A上,大的在下面,小的在上面,形成了一个塔状的锥形体. 对汉诺塔的一次合法的操作是指:从一根柱子的最上层拿一个盘子放到另一根柱子的最上层,同时要保证被移动的

汉诺塔(三)

汉诺塔(三) 描述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面.僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔.庙宇和众生也都将同归于尽. 现在我们把三根针编号为1,2,3. 所

python 实现汉诺塔问题

代码如下: def hano(n,x,y,z): if n==1: print(x,"->",z) else: #将n-1个盘子从x->y hano(n-1,x,z,y) #将剩余的最后一个盘子从x->z print(x,"->",z) #将剩余的n-1个盘子从y->z hano(n-1,y,x,z) n = int(input("请输入汉诺塔的层数:")) hano(n,"A","B&

NYOJ 93 汉诺塔(三) 【栈的简单应用】

汉诺塔(三) 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描写叙述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候.在当中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔. 不论白天黑夜,总有一个僧侣在依照以下的法则移动这些金片:一次仅仅移动一片.无论在哪根针上.小片必须在大片上面.僧侣们预言.当全部的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中