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 相关文章推荐
不用GD库生成当前时间的PNG格式图象的程序
Oct 09 PHP
PHP+DBM的同学录程序(1)
Oct 09 PHP
PHP新手上路(十三)
Oct 09 PHP
如何使用PHP中的字符串函数
Nov 24 PHP
理解和运用PHP中的多态性[译]
Aug 02 PHP
基于session_unset与session_destroy的区别详解
Jun 03 PHP
Codeigniter中mkdir创建目录遇到权限问题和解决方法
Jul 25 PHP
Symfony2使用Doctrine进行数据库查询方法实例总结
Mar 18 PHP
php foreach如何跳出两层循环(详解)
Nov 05 PHP
微信支付之JSAPI公众号支付详解
May 15 PHP
Yii框架函数简单用法分析
Sep 09 PHP
Laravel框架处理用户的请求操作详解
Dec 20 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
正义联盟的终局之战《天启星战争》将成为DC动画宇宙的最后一部
2020/04/09 欧美动漫
修改Zend引擎实现PHP源码加密的原理及实践
2008/04/14 PHP
Yii框架连接mongodb数据库的代码
2016/07/27 PHP
nginx 设置多个站跨域
2021/03/09 Servers
Javascript 学习笔记 错误处理
2009/07/30 Javascript
Javascript变量作用域详解
2013/12/06 Javascript
jquery uploadify 在FF下无效的解决办法
2014/09/26 Javascript
jQuery过滤选择器详解
2015/01/13 Javascript
NodeJS Web应用监听sock文件实例
2015/02/18 NodeJs
深入分析Javascript跨域问题
2015/04/17 Javascript
Javascript闭包(Closure)详解
2015/05/05 Javascript
Javascript函数的参数
2015/07/16 Javascript
JS原型链怎么理解
2016/06/27 Javascript
使用nodejs爬取前程无忧前端技能排行
2017/05/06 NodeJs
详解Vue整合axios的实例代码
2017/06/21 Javascript
使用Vue开发一个实时性时间转换指令
2018/01/17 Javascript
JavaScript实现的简单Tab点击切换功能示例
2018/07/06 Javascript
vue移动端轻量级的轮播组件实现代码
2018/07/12 Javascript
详解微信小程序开发(项目从零开始)
2019/06/06 Javascript
Koa从零搭建到Api实现项目的搭建方法
2019/07/30 Javascript
python复制与引用用法分析
2015/04/08 Python
Python爬取国外天气预报网站的方法
2015/07/10 Python
Python中的字符串类型基本知识学习教程
2016/02/04 Python
Python方法的延迟加载的示例代码
2017/12/18 Python
python多进程控制学习小结
2018/10/31 Python
python 根据时间来生成唯一的字符串方法
2019/01/14 Python
解决Django删除migrations文件夹中的文件后出现的异常问题
2019/08/31 Python
Python基本类型的连接组合和互相转换方式(13种)
2019/12/16 Python
pytorch实现mnist数据集的图像可视化及保存
2020/01/14 Python
应届大学生自荐信格式
2013/09/21 职场文书
留学自荐信的技巧
2013/10/17 职场文书
认错检讨书
2014/10/02 职场文书
校园学雷锋广播稿
2014/10/08 职场文书
2014年基层党建工作总结
2014/11/11 职场文书
2015年财务经理工作总结
2015/05/13 职场文书
Vite + React从零开始搭建一个开源组件库
2022/06/25 Javascript