PHP递归实现汉诺塔问题的方法示例


Posted in PHP onNovember 25, 2017

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

汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。简而言之,有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,请问至少需要多少次移动?

递归过程序如下:

1)把n-1个圆从A移到C
2)把剩下一个由A移到B
3)再把n-1个由C移到B,完成

代码如下:

<?php
//将所有圆盘从a移到b
function hanuota($n,$a,$b,$c){
  global $step;
  if($n==1){
    $step++;
    echo "将圆盘 $n 从 $a 柱子 到 $b 柱子 <br />";
  }else{
    hanuota($n-1,$a,$c,$b);
    $step++;
    echo "将圆盘 $n 从 $a 柱子 到 $b 柱子 <br />";
    hanuota($n-1,$c,$b,$a);
  }
}
//移动的次数
$step = 0;
hanuota(4, 'A', 'B', 'C');
echo "移动次数:" . $step;
?>

运行结果:

将圆盘 1 从 A 柱子 到 C 柱子
将圆盘 2 从 A 柱子 到 B 柱子
将圆盘 1 从 C 柱子 到 B 柱子
将圆盘 3 从 A 柱子 到 C 柱子
将圆盘 1 从 B 柱子 到 A 柱子
将圆盘 2 从 B 柱子 到 C 柱子
将圆盘 1 从 A 柱子 到 C 柱子
将圆盘 4 从 A 柱子 到 B 柱子
将圆盘 1 从 C 柱子 到 B 柱子
将圆盘 2 从 C 柱子 到 A 柱子
将圆盘 1 从 B 柱子 到 A 柱子
将圆盘 3 从 C 柱子 到 B 柱子
将圆盘 1 从 A 柱子 到 C 柱子
将圆盘 2 从 A 柱子 到 B 柱子
将圆盘 1 从 C 柱子 到 B 柱子
移动次数:15

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

PHP 相关文章推荐
多文件上传的例子
Oct 09 PHP
php小技巧 把数组的键和值交换形成了新的数组,查找值取得键
Jun 02 PHP
FireFox浏览器使用Javascript上传大文件
Oct 30 PHP
php旋转图片90度的方法
Nov 07 PHP
通过curl模拟post和get方式提交的表单类
Apr 23 PHP
async和DOM Script文件加载比较
Jul 20 PHP
php中ftp_chdir与ftp_cdup函数用法
Nov 18 PHP
php魔术函数__call()用法实例分析
Feb 13 PHP
PHP基于单例模式实现的数据库操作基类
Jan 15 PHP
利用PHP获取网站访客的所在地位置
Jan 18 PHP
php+mysql+jquery实现简易的检索自动补全提示功能
Apr 15 PHP
PHP 的Opcache加速的使用方法
Dec 29 PHP
PHP基于curl post实现发送url及相关中文乱码问题解决方法
Nov 25 #PHP
php图片合成方法(多张图片合成一张)
Nov 25 #PHP
PHP简单实现二维数组的矩阵转置操作示例
Nov 24 #PHP
PHP实现图的邻接矩阵表示及几种简单遍历算法分析
Nov 24 #PHP
PHP+Apache环境中如何隐藏Apache版本
Nov 24 #PHP
实例分析基于PHP微信网页获取用户信息
Nov 24 #PHP
thinkPHP通用控制器实现方法示例
Nov 23 #PHP
You might like
phpMyAdmin 安装教程全攻略
2007/03/19 PHP
编写漂亮的代码 - 将后台程序与前端程序分开
2008/04/23 PHP
php Memcache 中实现消息队列
2009/11/24 PHP
Smarty foreach控制循环次数的实现详解
2013/07/03 PHP
php实现通过ftp上传文件
2015/06/19 PHP
PHP表单提交后引号前自动加反斜杠的原因及三种办法关闭php魔术引号
2015/09/30 PHP
Yii使用技巧大汇总
2015/12/29 PHP
php封装的表单验证类完整实例
2016/10/19 PHP
laravel实现批量更新多条记录的方法示例
2017/10/22 PHP
PHP扩展类型及安装方式解析
2020/04/27 PHP
phpwind放自动注册方法
2006/12/02 Javascript
ext for eclipse插件安装方法
2008/04/27 Javascript
js onkeypress与onkeydown 事件区别详细说明
2012/12/13 Javascript
js判断FCKeditor内容是否为空的两种形式
2013/05/14 Javascript
两个select多选模式的选项相互移动(示例代码)
2014/01/11 Javascript
javascript中的self和this用法小结
2014/02/08 Javascript
jQuery 获取屏幕高度、宽度的简单实现案例
2016/05/17 Javascript
js利用正则表达式检验输入内容是否为网址
2016/07/05 Javascript
JavaScript实现页面无操作倒计时退出
2016/10/22 Javascript
基于jQuery和Bootstrap框架实现仿知乎前端动态列表效果
2016/11/09 Javascript
Bootstrap基本插件学习笔记之Tooltip提示工具(18)
2016/12/08 Javascript
JavaScript实现实时更新系统时间的实例代码
2017/04/04 Javascript
基于angular实现三级联动的生日插件
2017/05/12 Javascript
Angular.JS中的this指向详解
2017/05/17 Javascript
关于vue路由缓存清除在main.js中的设置
2019/11/06 Javascript
python计算对角线有理函数插值的方法
2015/05/07 Python
Python实现批量将word转html并将html内容发布至网站的方法
2015/07/14 Python
在linux下实现 python 监控usb设备信号
2019/07/03 Python
python中的Elasticsearch操作汇总
2019/10/30 Python
Django 允许局域网中的机器访问你的主机操作
2020/05/13 Python
物业管理员岗位职责范文
2013/11/25 职场文书
运动会演讲稿50字
2014/08/25 职场文书
庆祝教师节演讲稿
2014/09/03 职场文书
2014年乡镇团委工作总结
2014/12/18 职场文书
2015年社区教育工作总结
2015/05/13 职场文书
python 安全地删除列表元素的方法
2022/03/16 Python