递归--汉诺塔问题 (Hanoi)

汉诺塔问题(Hanoi):古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图)。有一个和尚想把这64个盘子从A座移到C座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用B座,要求输出移动的步骤 。

结题思路:利用递归思想结题,就是找出其每步的共同规律,然后必须有一步是递归的终止条件。

先假设第一种情况:3根柱,从左到右A,B,C,上面小号,底部大号,从上往下递增。

如要完成该任务,经历3步:

1.1移至B

2.2移至C

3.1移至C

完成操作。

第二种情况:

如果要完成该任务,3要移至C,也需要经历3个步骤,假设1,2是个整体,

那么第1步,1,2需要移至B柱,

第2步,3移至C柱,

第3步1,2移至C柱。

递归的思路:按照上述三步规则,3号盘要实现到达C柱,它会对2号盘说,接着2号盘对1号盘说,也就是这样依次调用。

如果有4个盘,那么是4调用3,3调用2,2调用1,1直接移动目标柱子(中间变化过程不一定是C柱,这里好思考一下,因为递归调用的原因,目标柱子会变化)。

递归终止的条件:当只有1个盘的情况,直接1号盘直接到达C柱,这个就是递归的终止条件。

我觉得关键是要理解,C不一定是目标柱,比如:有3个盘的时候,3号盘的目标是C,那么结果要求1,2号盘移至B柱,那么这个时候,对这样的结果而已,2号盘的目标既是B柱,C为中间柱,也就是1号盘移至C,2号盘移至B,1号盘再移回B柱,才能出现3号盘需要1,2在B柱的结果。

Python代码如下:

#记录第几次移动
num = 0
#把i号盘,从src柱移至to柱
def Move(i,src,to):
    #global num
    num = num + 1
    print("第 " + str(num) + " 次移动 : " + " 把 " + str(i) + " 号圆盘从 " + src + " ->移到->  " + to )

def Hanoi(n,a,b,c):
    #print(n,a,b,c)
    if (n == 1):
        return Move(1,a,c)
    else:
        #如果不好理解,可以先假设n=3来理解该递归调用
        #递归调用,n-1号盘先从a移至b
        Hanoi(n-1,a,c,b)
        #n号盘从a移至c
        Move(n,a,c)
        #n-1号盘从b移至c
        Hanoi(n-1,b,a,c)

def main():
    print("把A塔上的圆盘通过B辅助塔移动到C塔,初始A塔上序号最小的在最顶端,序号最大的在最低端!")
    n, left, mid, right = input("请输入圆盘个数和3个柱的名称,以逗号相隔:").split(",")
    n = int(n)
    Hanoi(n,left,mid,right)

if __name__ == "__main__":
    main()

原文地址:https://www.cnblogs.com/an-wl/p/12316664.html

时间: 2024-09-28 23:08:07

递归--汉诺塔问题 (Hanoi)的相关文章

Bailian4147 汉诺塔问题(Hanoi)

4147:汉诺塔问题(Hanoi) 总时间限制: 1000ms 内存限制: 65535kB 描述 一.汉诺塔问题 有三根杆子A,B,C.A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小.要求按下列规则将所有圆盘移至C杆: 每次只能移动一个圆盘: 大盘不能叠在小盘上面. 提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则. 问:如何移?最少要移动多少次? 汉诺塔示意图如下: 三个盘的移动: 二.故事由来 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传

【数据结构与算法】递归汉诺塔

汉诺塔 汉诺塔是根据一个传说形成的数学问题(关于汉诺塔): 有三根杆子A,B,C.A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小.要求按下列规则将所有圆盘移至C杆: 每次只能移动一个圆盘: 大盘不能叠在小盘上面. 提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则. 递归汉诺塔 解题思路: 可以把问题简化成2个盘子的情况,如:A上有两个盘子,B和C是空的.如果要把A的两个盘子全部移动到C,需要经过以下步骤: 1.A移动一个盘子到B 2.A移动一个盘

Acdream 1219 The Towers of Hanoi Revisited(递归汉诺塔问题)

传送门 The Towers of Hanoi Revisited Special Judge Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Submit Statistic Next Problem Problem Description You all must know the puzzle named "The Towers of Hanoi". The puzz

C#递归解决汉诺塔问题(Hanoi)

using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace MyExample_Hanoi_{    class Program    {        static void Main(string[] args)        {            HanoiCalculator c = new HanoiCalculator();            Cons

递归汉诺塔

/*汉诺塔的玩法: * 游戏的规则:将A柱上的盘子移动到C柱上,大盘必须在小盘之上. * 1 当A柱上只有一个盘子的时候,直接移动到C柱上: * 2 当A柱上有两个盘子的时候, *   将A柱上的1盘(从上到下编号)移动到B柱, *   将A柱上的2盘移动到C柱, *   将B柱上的1盘移动到C柱: *   (将A上的1~n-1盘---->B柱,将A柱上n---->C柱,B柱上的1~n-1盘---->C柱) * 3 当A柱上有三个盘子的时候,将A柱上的1~2盘移动到B柱, *   将A柱

汉诺塔问题(Hanoi)的C++代码实现

1 #include <iostream> 2 using namespace std; 3 //第一个塔为初始塔,第二个塔为中转塔,第三个塔为目标塔 4 5 int i = 1; //记录步数 6 void move(int n,char from,char to) //将编号为N的盘子由from塔转移到to塔 7 { 8 cout<<"第"<<i++<<"步:将"<<n<<"号盘子

JavaScript算法实现之汉诺塔(Hanoi)

目前前端新手,看到的不喜勿喷,还望大神指教. 随着Node.js,Angular.js,JQuery的流行,点燃了我学习JavaScript的热情!以后打算每天早上跟晚上抽2小时左右时间将经典的算法都用JS来实现,加快学习JS的步伐(用这个办法方便跟自己以前学过的C++语言作对比,找出不同),希望自己能够坚持下去!!! 首先来个汉诺塔的. <script>      function hanoi(n,a,b,c){          if(n==1){              documen

2017.11.26 计算机算法之分治与递归——汉诺塔

1.我的递归算法(纯粹的递归) #include <stdio.h>//当盘子数n等于15时,移动次数已经达到32767,运行时间已经达到15.540s long long count; void hanoi(int n,char a,char b,char c)//借助C将A上的盘子全部移动到B { if(n==0) return; hanoi(n-1,a,c,b); printf("%c --> %c\n",a,b); count++; hanoi(n-1,c,b

汉诺塔问题(Hanoi)

描述 一.汉诺塔问题 有三根杆子A,B,C.A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小.要求按下列规则将所有圆盘移至C杆: 每次只能移动一个圆盘: 大盘不能叠在小盘上面. 提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则. 问:如何移?最少要移动多少次? 汉诺塔示意图如下: 三个盘的移动: 二.故事由来 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在