PHP实现的解汉诺塔问题算法示例


Posted in PHP onAugust 06, 2018

本文实例讲述了PHP实现的解汉诺塔问题算法。分享给大家供大家参考,具体如下:

问题描述:

相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。

解决思路:

(1)以C盘为中介,从A杆将1至n-1号盘移至B杆;
(2)将A杆中剩下的第n号盘移至C杆;
(3)以A杆为中介;从B杆将1至n-1号盘移至C杆。

PHP实现的解汉诺塔问题算法示例

PHP代码实现:

/**
 * 汉诺塔(3根柱子)
 * @param unknown $n
 * @param string $a        // 当前位置
 * @param string $b        // 中转位置
 * @param string $c        // 目标位置
 */
function hanoi($n,$a='A',$b='B',$c='C'){
  if( $n==1 ){
    echo "{$a}->{$c} <br/>";
  }else{
    hanoi($n-1,$a,$c,$b);    // 将最大盘上的盘子,借助C柱,全部移动到B柱上
    echo "{$a}->{$c} <br/>";  // 将最大盘直接从A柱移到C柱
    hanoi($n-1,$b,$a,$c);    // 再将B柱上的盘子,借助A柱,全部移到C柱
  }
}
//测试:
hanoi(3,$a='A',$b='B',$c='C')

运行结果:

A->C
A->B
C->B
A->C
B->A
B->C
A->C

思考:假如是4根柱子的汉诺塔,怎么移动效率最高?

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php email邮箱正则
Oct 08 PHP
php 计算两个时间戳相隔的时间的函数(小时)
Dec 18 PHP
解析php防止form重复提交的方法
Jul 01 PHP
php处理restful请求的路由类分享
Feb 27 PHP
php从字符串创建函数的方法
Mar 16 PHP
WAMP环境中扩展oracle函数库(oci)
Jun 26 PHP
PHP常用字符串操作函数实例总结(trim、nl2br、addcslashes、uudecode、md5等)
Jan 09 PHP
Zend Framework教程之视图组件Zend_View用法详解
Mar 05 PHP
thinkphp制作404跳转页的简单实现方法
Sep 22 PHP
Yii框架防止sql注入,xss攻击与csrf攻击的方法
Oct 18 PHP
PHP基于面向对象封装的分页类示例
Mar 15 PHP
php实现文件上传基本验证
Mar 04 PHP
PHP实现普通hash分布式算法简单示例
Aug 06 #PHP
PHP实现的无限分类类库定义与用法示例【基于thinkPHP】
Aug 06 #PHP
PHP常用字符串函数小结(推荐)
Aug 05 #PHP
PHP使用标准库spl实现的观察者模式示例
Aug 04 #PHP
PHP设计模式之观察者模式定义与用法示例
Aug 04 #PHP
PHP操作redis实现的分页列表,新增,删除功能封装类与用法示例
Aug 04 #PHP
PHP一致性hash分布式算法封装类定义与用法示例
Aug 04 #PHP
You might like
PHP中的类-什么叫类
2006/11/20 PHP
php XPath对XML文件查找及修改实现代码
2011/07/27 PHP
分享一个漂亮的php验证码类
2016/09/29 PHP
php遍历目录下文件并按修改时间排序操作示例
2019/07/12 PHP
一句话JavaScript表单验证代码
2009/08/02 Javascript
javascript中的float运算精度实例分析
2010/08/21 Javascript
jQuery3.0中的buildFragment私有函数详解
2016/08/16 Javascript
读Javascript高性能编程重点笔记
2016/12/21 Javascript
JS去掉字符串前后空格或去掉所有空格的用法
2017/03/25 Javascript
Vue项目中引入外部文件的方法(css、js、less)
2017/07/24 Javascript
从对象列表中获取一个对象的方法,依据关键字和值
2017/09/20 Javascript
JS手机端touch事件计算滑动距离的方法示例
2017/10/26 Javascript
[15:46]教你分分钟做大人——沙王
2015/03/11 DOTA
[02:24]DOTA2亚洲邀请赛 NAVI战队出场宣传片
2015/02/07 DOTA
[10:42]Team Liquid Vs Newbee
2018/06/07 DOTA
[01:34:42]NAVI vs EG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python编程语言的35个与众不同之处(语言特征和使用技巧)
2014/07/07 Python
python安装mysql-python简明笔记(ubuntu环境)
2016/06/25 Python
动态规划之矩阵连乘问题Python实现方法
2017/11/27 Python
python将文本中的空格替换为换行的方法
2018/03/19 Python
Python使用 Beanstalkd 做异步任务处理的方法
2018/04/24 Python
Python操作Oracle数据库的简单方法和封装类实例
2018/05/07 Python
Django ORM 常用字段与不常用字段汇总
2019/08/09 Python
python多进程(加入进程池)操作常见案例
2019/10/21 Python
python实现图像拼接功能
2020/03/23 Python
Python高并发和多线程有什么关系
2020/11/14 Python
css3进行截取替代js的substring
2013/09/02 HTML / CSS
如何设置Java的运行环境
2013/04/05 面试题
桥梁与隧道工程专业本科生求职信
2013/10/08 职场文书
《莫高窟》教学反思
2014/02/25 职场文书
微笑面对生活演讲稿
2014/05/13 职场文书
本科毕业生自荐信
2014/05/26 职场文书
2014年中学生检讨书大全
2014/10/09 职场文书
《红领巾真好》教学反思
2016/02/16 职场文书
教你利用python实现企业微信发送消息
2021/05/23 Python
浅谈Redis主从复制以及主从复制原理
2021/05/29 Redis