python中汉诺塔如何理解_【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')

递归:汉诺塔 - 零基础入门学习Python024

递归:汉诺塔 让编程改变世界 Change the world by program 似乎谈到递归算法就要拿汉诺塔来举例,没办法,因为小甲鱼小时候太笨了,这个游戏老是玩不过关,好不容易在自学编程的时候 ...

【Python实践-3】汉诺塔问题递归求解(打印移动步骤及计算移动步数)

# -*- coding: utf-8 -*- #汉诺塔移动问题 # 定义move(n,a,b,c)函数,接受参数n,表示3个柱子A.B.C中第1个柱子A的盘子数量 # 然后打印出把所有盘子从A借助B ...

python递归——汉诺塔

汉诺塔的传说 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了 ...

python 递归-汉诺塔

# 汉诺塔 a = "A" b = "B" c = "C" def hano(a, b, c, n): if n == 1: print(& ...

C语言 递归 汉诺塔问题 最大公约数问题

函数不能嵌套定义,但能嵌套调用(在调用一个函数的过程中再调用另一个函数) 函数间接或直接调用自己,称为递归调用  汉诺塔问题 思想:简化为较为简单的问题 n=2 较为复杂的问题,采用数学归纳方法分析 ...

js 递归 汉诺塔的例子

程序调用自身的编程技巧称为递归. //汉诺塔的游戏,n为圆盘编号数量,编号,a,b,c代表的是三个柱子 var hanio=function(n,a,b,c){     if(n>0){    ...

汉诺塔(Hanoi)——小小算法

传送门: 袁咩咩的小小博客 汉诺(Hanoi)塔源于古印度,是非常著名的智力趣题,大意如下: 勃拉玛是古印度的一个开天辟地的神,其在一个庙宇中留下了三根金刚石的棒,第一 根上面套着64个大小不一的圆形 ...

PKU《程序设计》专项课程_递归汉诺塔问题

取自coursera.org上公开课北京大学 递归调用注意的点 1.关注点放在求解的目标上,递推是,目标放在开头 2.找到第N次和第(N-1)次之间的关系,通项公式 3. ...

python --内建结构 汉诺塔结构

规则: 1.每次移动一个盘子 2.任何时候大盘子在下面,小盘子在上面 方法: 1.n=1:直接将A上的盘子移动到c 上面,A->C 2.n=2: 1>A->B 2>A-> ...

随机推荐

Mongoose学习笔记

#名词解释: Schema 一种以文件形式存储的数据库模型骨架,不具备对数据库操作的能力 Model 由Schema生成的模型,具有抽象属性和行为,能够操作数据库 Entity 由Model创建的实体 ...

C++读写文件ofstream,ifstream,fstream)[转]

在看C++编程思想中,每个练习基本都是使用ofstream,ifstream,fstream,以前粗略知道其用法和含义,在看了几位大牛的博文后,进行整理和总结: 这里主要是讨论fstream的内容:[ ...

游标的使用之压缩数据库Log文件

declare @databasename nvarchar(100)--定义游标以及赋值 获取所有Online的Database Namedeclare getDataBaseCursor  cur ...

Source Insight基本使用和快捷键

Source Insight基本使用和快捷键 为什么要用Source Insight呢?貌似是因为比完整的IDE要更快一些,比较利于查看大量的代码. 软件的安装很简单,设置好安装目录. 配置好文档路径 ...

[开发笔记]-jQuery获取checkbox选中项等操作及注意事项

今天在做一个项目功能时需要显示checkbox选项来让用户进行选择,由于前端不是很熟练,所以做了一个简单的Demo,其中遇到一些小问题,特记录下来,希望能帮到遇到类似问题的同学们. 1. 获取chec ...

Qt之等待提示框(QTimer)

简述 上节讲述了关于QPropertyAnimation实现等待提示框的显示,本节我们使用另外一种方案来实现-使用定时器QTimer,通过设置超时时间定时更新图标达到旋转效果. 简述 效果 资源 源码 ...

s3c2416裸跑环境配置

最近刚刚开始学习ARM-linux,上周买了块tq2416的板子,给的Linux资料太复杂太深奥不愿看,等不及想要把2416跑起来.于是到处找相关裸跑资料,可是用2416的人实在少,网上的资料更少,裸 ...

iOS 制作 framework 教程

直接看步骤 废话不多说,哈哈! 1.新建一个静态库工程: 2:取自己喜欢的名字: 3.删除向导所生成工程中的 Target: 3.删除TestFrameWork对应的工程文件夹: 5:删除bulid ...

把事务封装成类似Serializable用法的特性

把事务封装成类似Serializable用法的特性 最近几天上班没事可做就想着整理常用的类库方法,验证.消息.分页.模版引擎.数据库操作.ini操作.文本操作.xml操作等,最后就是现在这个事务特性. ...

在OSGI容器Equinox中嵌入HttpServer


版权声明:本文为weixin_39957951原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。