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 相关文章推荐
PHP 读取文件的正确方法
Apr 29 PHP
yii框架源码分析之创建controller代码
Jun 28 PHP
对象失去焦点时自己动提交数据的实现代码
Nov 06 PHP
探讨fckeditor在Php中的配置详解
Jun 08 PHP
php mysql_real_escape_string函数用法与实例教程
Sep 30 PHP
php读取目录及子目录下所有文件名的方法
Oct 20 PHP
培养自己的php编码规范
Sep 28 PHP
PHP程序中的文件锁、互斥锁、读写锁使用技巧解析
Mar 21 PHP
利用phpexcel对数据库数据的导入excel(excel筛选)、导出excel
Apr 27 PHP
php 使用curl模拟ip和来源进行访问的实现方法
May 02 PHP
详谈symfony window下的安装 安装时候出现的问题以及解决方法
Sep 28 PHP
ThinkPHP框架实现导出excel数据的方法示例【基于PHPExcel】
May 12 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
php简单实现单态设计模式的方法分析
2017/07/28 PHP
PHP排序算法之希尔排序(Shell Sort)实例分析
2018/04/20 PHP
PDO::errorInfo讲解
2019/01/28 PHP
(转载)JavaScript中匿名函数,函数直接量和闭包
2007/05/08 Javascript
js左侧多级菜单动态的解决方案
2010/02/01 Javascript
JQuery EasyUI 对话框的使用方法
2010/10/24 Javascript
JS的encodeURI和java的URLDecoder.decode使用介绍
2014/05/08 Javascript
js防止页面被iframe调用的方法
2014/10/30 Javascript
深入浅析JavaScript中prototype和proto的关系
2015/11/15 Javascript
vue实现图片滚动的示例代码(类似走马灯效果)
2018/03/03 Javascript
JS将网址url转化为JSON格式的方法
2018/07/02 Javascript
JS打印彩色菱形的实例代码
2018/08/15 Javascript
js jquery 获取某一元素到浏览器顶端的距离实现方法
2018/09/05 jQuery
vue项目中,main.js,App.vue,index.html的调用方法
2018/09/20 Javascript
在vue中更换字体,本地存储字体非引用在线字体库的方法
2018/09/28 Javascript
如何使用Node.js爬取任意网页资源并输出PDF文件到本地
2019/06/17 Javascript
layui 实现自动选择radio单选框(checked)的方法
2019/09/03 Javascript
ES6常用小技巧总结【去重、交换、合并、反转、迭代、计算等】
2019/12/21 Javascript
详解Vue的watch中的immediate与watch是什么意思
2019/12/30 Javascript
jQuery实现开关灯效果
2020/08/02 jQuery
javascript实现移动端轮播图
2020/12/09 Javascript
[00:35]DOTA2上海特级锦标赛 MVP.Phx战队宣传片
2016/03/04 DOTA
浅谈python迭代器
2017/11/08 Python
使用python实现unix2dos和dos2unix命令的例子
2019/08/13 Python
python解释器spython使用及原理解析
2019/08/24 Python
python 用户交互输入input的4种用法详解
2019/09/24 Python
python读取多层嵌套文件夹中的文件实例
2020/02/27 Python
如何利用python发送邮件
2020/09/26 Python
CSS3制作日历实现代码
2012/01/21 HTML / CSS
深入浅析CSS3中的Flex布局整理
2020/04/27 HTML / CSS
出国留学自荐信
2013/10/25 职场文书
银行门卫岗位职责
2013/12/29 职场文书
会计与出纳自荐书范文
2014/03/16 职场文书
教代会开幕词
2015/01/28 职场文书
储备店长岗位职责
2015/04/14 职场文书
js中Object.create实例用法详解
2021/10/05 Javascript