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')
  • 相关阅读:
    在IDEA上本地更新同步Git中的更改
    protobuf的序列化和反序列化
    关于Pytorch报警告:Warning: indexing with dtype torch.uint8 is now deprecated, please use a dtype torch.bool instead
    990. 等式方程的可满足性
    死锁
    事务隔离
    Lab-1
    软件测试homework3
    TCP/UDP网络连接的固定写法
    软件测试Homework 2
  • 原文地址:https://www.cnblogs.com/cjvae/p/9319805.html
Copyright © 2011-2022 走看看