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的FTP学习(一)
Oct 09 PHP
php+mysql写的简单留言本实例代码
Jul 25 PHP
php 中文处理函数集合
Aug 27 PHP
解析用PHP读写音频文件信息的详解(支持WMA和MP3)
May 10 PHP
你应该知道PHP浮点数知识
May 13 PHP
php读取der格式证书乱码解决方法
Jun 22 PHP
PHP模拟QQ登录的方法
Jul 29 PHP
PHP实现仿百度文库,豆丁在线文档效果(word,excel,ppt转flash)
Mar 10 PHP
php使用正则验证中文
Apr 06 PHP
PHP实现适用于文件内容操作的分页类
Jun 15 PHP
PHP 获取客户端 IP 地址的方法实例代码
Nov 11 PHP
PHP观察者模式定义与用法实例分析
Mar 22 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
Linux下进行MYSQL编程时插入中文乱码的解决方案
2007/03/15 PHP
PHP会话控制:Session与Cookie详解
2014/09/27 PHP
php 三元运算符实例详细介绍
2016/12/15 PHP
laravel model模型定义实现开启自动管理时间created_at,updated_at
2019/10/17 PHP
JS类中定义原型方法的两种实现的区别
2007/03/08 Javascript
jQuery timers计时器简单应用说明
2010/10/28 Javascript
js 实现css风格选择器(压缩后2KB)
2012/01/12 Javascript
IE下JS读取xml文件示例代码
2013/08/05 Javascript
js用Date对象的setDate()函数对日期进行加减操作
2014/09/18 Javascript
JS组件Bootstrap Table表格多行拖拽效果实现代码
2015/12/08 Javascript
javascript url几种编码方式详解
2016/06/06 Javascript
JavaScript仿微博输入框效果(案例分析)
2016/12/06 Javascript
详解nodejs 文本操作模块-fs模块(四)
2016/12/22 NodeJs
浅析vue数据绑定
2017/01/17 Javascript
基于bootstrap实现bootstrap中文网巨幕效果
2017/05/02 Javascript
websocket+node.js实现实时聊天系统问题咨询
2017/05/17 Javascript
vue-resource请求实现http登录拦截或者路由拦截的方法
2018/07/11 Javascript
解决在vue项目中webpack打包后字体不生效的问题
2018/09/01 Javascript
JS异步执行结果获取的3种解决方式
2019/02/19 Javascript
Vue(定时器)解决mounted不能获取到data中的数据问题
2020/07/30 Javascript
vue:el-input输入时限制输入的类型操作
2020/08/05 Javascript
python求crc32值的方法
2014/10/05 Python
在Python的Django框架上部署ORM库的教程
2015/04/20 Python
浅谈python中列表、字符串、字典的常用操作
2017/09/19 Python
TensorFlow tensor的拼接实例
2020/01/19 Python
Django REST Framework 分页(Pagination)详解
2020/11/30 Python
canvas实现图片镜像翻转的2种方式
2020/07/22 HTML / CSS
经典c++面试题六
2012/01/18 面试题
汽车专业学生自我评价
2014/01/19 职场文书
实习护士自荐信
2014/06/21 职场文书
县政府班子个人对照检查材料
2014/10/05 职场文书
上班迟到检讨书范文300字
2014/11/02 职场文书
党的群众路线教育实践活动学习笔记范文
2014/11/06 职场文书
2014年工程师工作总结
2014/11/25 职场文书
初中数学教学随笔
2015/08/15 职场文书
JDBC连接的六步实例代码(与mysql连接)
2021/05/12 MySQL