zoukankan      html  css  js  c++  java
  • 用递归函数解决汉诺塔移动问题。

    汉诺塔的定义:

      1、总共更有三个柱子,在第一根柱子上,从下往上按从大到小的顺序叠放着一堆盘子,即下大上小;

      2、每次只能移动一个盘子,且大盘子不能放在小盘子上面,即保证每根柱子上盘子都是下大上小;

      3、最终目标是把盘子从左边第一根柱子,移动到右边第三个柱子。

    利用递归函数解决汉诺塔移动:

    假定有n个盘子,从左到右依次有a,b,c三个柱子。刚开始n个盘子都在a柱子上。

    若n=1,直接把盘子从a移动到c;

    若n>1,则:

    第一步:把a柱子上除最下面的那个盘子外的n-1个盘子,全部移动到b柱子上;

    第二步:把a柱子上最下面的那个盘子,移动到c柱子上;

    第三步:把b柱子上的n-1个盘子,全部移动到c柱子上;

    代码如下:

    def move(n,a,b,c):
        if n==1:
            print('move',a,'-->','c') #圆盘个数为1时,从a移动到c即可完成,用来终止递归
        else:
            move(n-1,a,c,b)  #把除了a柱子最下的一个圆盘以外的其他圆盘,都移动到b柱子
            move(1,a,b,c)    #把a柱子最下的圆盘,移动到c柱子
            move(n-1,b,a,c)  #把b柱子上的n-1个盘子,全部移动到c柱子

    假定n=3,该程序执行过程如下:

    move(3,a,b,c)

    move(3,a,b,c)
        move(2,a,c,b)      #a柱上面两个盘子,移动到b柱子
            move(1,a,b,c)    #a柱最上面一个盘,移动到b柱。对函数move(2,a,c,b),其‘a’柱为a,‘b’柱为 c。因n=1,执行print语句,a-->c
            move(1,a,c,b)    #a柱子最下面盘子移动到c柱子。对于move(2,a,c,b)函数,其‘c’柱子为 b。因n=1,执行print语句,a-->b
            move(1,c,a,b)    #b柱子上的一个盘子移动到c柱子。对于move(2,a,c,b)函数,其‘b’柱子为 c,'c'柱为b。因n=1,执行print语句,c-->b
        move(1,a,b,c)      #a柱最下面盘子,移动到c柱子。因n=1,执行print语句,a-->c
        move(2,b,a,c)      #b柱上的两个盘,移动到c柱
            move(1,b,c,a)    #a柱最上面一个盘,移动到b柱。对函数move(2,b,a,c),其‘a’柱为b,‘b’柱为a。因n=1,执行print语句,b-->a
            move(1,b,a,c)    #a柱最下面的盘移动到c柱。对move(2,b,a,c)函数,其‘a’柱为b,‘c’柱为c。因n=1,执行print语句,b-->c
            move(1,a,b,c)    #b柱上的一个盘移动到c柱。对move(2,b,a,c)函数,其‘b’柱为a,‘c’柱为c。因n=1,执行print语句,a-->c
    
    #程序依次执行,显示的顺序为:
    move a-->c
    move a-->b
    move c-->b
    move a-->c
    move b-->a
    move b-->c
    move a-->c
  • 相关阅读:
    WCF 第三章 信道
    WCF 第三章 信道形状
    对单表数据生成insert语句
    WCF 第二章 契约 定义类的层次结构
    WCF 第三章 信道 总结
    Win32类型和.net类型的对应表
    用一条SQL语句实现斐波那契数列
    WCF 第一章 基础 为一个ASMX服务实现一个WCF客户端
    WCF 第二章 契约 数据契约版本
    WCF 第二章 契约 异步访问服务操作
  • 原文地址:https://www.cnblogs.com/haidaojiege/p/7764012.html
Copyright © 2011-2022 走看看