【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')
上一篇:jQuery插件开发 格式与解析2


下一篇:fatal error LNK1104: 无法打开文件“libc.lib”的问题