• 【Python学习之七】递归——汉诺塔问题的算法理解


    汉诺塔问题

           汉诺塔的移动可以用递归函数非常简单地实现。请编写move(n, a, b, c)函数,它接收参数n,表示3个柱子A、B、C中第1个柱子A的盘子数量,然后打印出把所有盘子从A借助B移动到C的方法。

      汉诺塔问题的实现关键是理解递归的本质。递归问题的关键个人认为是,重目的而略过程。利用递归,我们不需要了解搬移盘子的过程。只需要知道,我们的目的是按照顺序和规则把盘子从A柱放到C柱。于是编写一个函数,move(n, a, b, c)。可以这样理解:move(盘子数量, 起点, 缓冲区, 终点)。

    分析函数要执行的步骤:

    1、A上只有一个盘子的情况,直接搬到C,代码如下:

    if n == 1:
        print(a, '-->', c)

    2、A上不止有一个盘子的情况

        2.1 首先,需要把n-1个盘子搬到缓冲区B柱子。打印出的效果是:a --> b。

          move(n - 1, a, c, b) 

      2.1  再把最大的盘子搬到C柱子,也是最大尺寸的一个。打印出:a-->c。

         move(1, a, b, c) 

      2.2 最后,把剩下B柱的n-1个盘子搬到C上,此时缓冲区变成了起点,起点变成了缓冲区。

         move(n - 1, b, a, c) 

    3、完整的代码十分简洁,如下所示:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # @Date    : 2018-05-22 16:22:13
    # @Author  : Chen Jing (cjvaely@foxmail.com)
    # @Link    : https://github.com/Cjvaely
    # @Version : $Id$
    
    # 汉诺塔的移动可以用递归函数非常简单地实现
    # 需求:打印出把所有盘子从A借助B移动到C的方法
    
    
    def move(n, a, b, c):
        if n == 1:
            print(a, '-->', c)
        else:
            move(n - 1, a, c, b)
            move(1, a, b, c)
            move(n - 1, b, a, c)
    
            # 期待输出:
            # A --> C
            # A --> B
            # C --> B
            # A --> C
            # B --> A
            # B --> C
            # A --> C
    
    
    move(3, 'A', 'B', 'C')
  • 相关阅读:
    DICOM属性备忘传输语义Transfer Syntax
    【Java】java return和break以及continue的区别
    【点点点】selenium原理解析
    sudo python执行时出现No module named
    常见函数
    Hive(一)命令行参数、变量、虚拟列、配置
    Hive(五)索引、视图、定时器
    设置博客园的表格样式
    Temporary Post Used For Theme Detection (1195facf4fdb4055b6d8f69756fe8e8b 3bfe001a32de4114a6b44005b770f6d7)
    MySQL8 把JSON字段,直接转换为多行数据1
  • 原文地址:https://www.cnblogs.com/cjvae/p/9319805.html
Copyright © 2020-2023  润新知