zoukankan      html  css  js  c++  java
  • 【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')
  • 相关阅读:
    C#使用 System.Net.Mail发送邮件功能
    移动H5前端性能优化指南
    chrome主页被篡改为hao123 win10系统
    jqGrid TreeGrid 加载数据 排序 扩展
    Dapper 链式查询 扩展
    T4 代码生成 Demo (抽奖程序)
    反射实现 Data To Model
    highcharts .net导出服务 和 两种导出方式
    jQuery 自定义插件 (分页控件)
    ajax 多级联动 下拉框 Demo
  • 原文地址:https://www.cnblogs.com/cjvae/p/9319805.html
Copyright © 2011-2022 走看看