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
  • 相关阅读:
    python操作 pdf 资料
    PyQt 实现 GUI
    https://zhuanlan.zhihu.com/p/60647332
    [转]框架《Python深度学习基于PyTorch》PDF+代码检测
    python学习资料
    Python虚拟环境打包
    A* 算法详解
    opencv python 图像二值化/简单阈值化/大津阈值法
    语音识别——基于深度学习的中文语音识别tutorial(代码实践)
    OpenCV资料
  • 原文地址:https://www.cnblogs.com/haidaojiege/p/7764012.html
Copyright © 2011-2022 走看看