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')
  • 相关阅读:
    pat甲级 1155 Heap Paths (30 分)
    pat甲级 1152 Google Recruitment (20 分)
    蓝桥杯 基础练习 特殊回文数
    蓝桥杯 基础练习 十进制转十六进制
    蓝桥杯 基础练习 十六进制转十进制
    蓝桥杯 基础练习 十六进制转八进制
    51nod 1347 旋转字符串
    蓝桥杯 入门训练 圆的面积
    蓝桥杯 入门训练 Fibonacci数列
    链表相关
  • 原文地址:https://www.cnblogs.com/cjvae/p/9319805.html
Copyright © 2011-2022 走看看