博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
课时24:递归:汉诺塔
阅读量:5132 次
发布时间:2019-06-13

本文共 1121 字,大约阅读时间需要 3 分钟。

目录:

   一、汉诺塔

   二、课时24课后习题及答案

 

*************

一、汉诺塔

*************

汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

对于游戏的玩法,我们可以简单分解为三个步骤

(1)将前63个盘子从X移动到Y上。
(2)将最底下的第64个盘子从X移动到Z上。
(3)将Y上的63个盘子移动到Z上。

仔细想下,在游戏中,我们发现每次都只能移动一个圆盘,所以在移动的过程中显然要借助另外一根针才可以实施。也就是说,步骤(1)将1~63个盘子需要借助Z移到Y上,步骤(3)将Y针上的63个盘子需要借助X移到Z针上。

所以把新思路聚集为以下两个问题:

问题一:将X上的63个盘子借助Z移到Y上;

问题二:将Y上的63个盘子借助X移到Z上。

 

可以拆分为3个步骤来实现:

问题一(“将X上的63个盘子借助Z移到Y上”)拆解为:

(1)将前62个盘子从X移动到Z上。
(2)将最底下的第63个盘子移动到Y上。
(3)将Z上的62个盘子移动到Y上。

问题二(“将Y上的63个盘子借助X移到Z上”)拆解为:

(1)将前62个盘子从Y移动到X上。
(2)将最底下的第63个盘子移动到Z上。
(3)将X上的62个盘子移动到Y上。

说到这里,你发现了什么?没错,汉诺塔的拆解过程刚好满足递归算法的定义,因此,对于如此难题,使用递归来解决,问题就变得相当简单。参考代码:

def hanoi(n, x, y, z):    if n == 1:        print(x, ' --> ', z)    else:        hanoi(n-1, x, z, y) # 将前n-1个盘子从x移动到y上        print(x, ' --> ', z) # 将最底下的最后一个盘子从x移动到z上        hanoi(n-1, y, x, z) # 将y上的n-1个盘子移动到z上n = int(input('请输入汉诺塔的层数:'))hanoi(n, 'X', 'Y', 'Z')

看!这就是递归的魔力。

 

*******************************

二、课时24课后习题及答案

*******************************

转载于:https://www.cnblogs.com/DC0307/p/9482909.html

你可能感兴趣的文章
局域网内手机访问电脑网站注意几点
查看>>
[Serializable]的应用--注册码的生成,加密和验证
查看>>
Android-多线程AsyncTask
查看>>
LeetCode【709. 转换成小写字母】
查看>>
CF992E Nastya and King-Shamans(线段树二分+思维)
查看>>
如果没有按照正常的先装iis后装.net的顺序,可以使用此命令重新注册一下:
查看>>
linux install ftp server
查看>>
alter database databasename set single_user with rollback IMMEDIATE 不成功问题
查看>>
【题解】青蛙的约会
查看>>
autopep8
查看>>
GIT在Linux上的安装和使用简介
查看>>
Android 官方新手指导教程
查看>>
幸运转盘v1.0 【附视频】我的Android原创处女作,请支持!
查看>>
[51nod] 1199 Money out of Thin Air #线段树+DFS序
查看>>
Red and Black(poj-1979)
查看>>
安装 Express
查看>>
存储(硬件方面的一些基本术语)
查看>>
观察者模式
查看>>
Weka中数据挖掘与机器学习系列之基本概念(三)
查看>>
Win磁盘MBR转换为GUID
查看>>