汉诺塔问题

我个人觉得对于如何去用递归的思想解决问题,关键在于从最根本点思考一个问题,先不用管小的实现过程。

比如经典的汉诺塔问题,其实很简单,先不用去想一个个盘子怎么去移动,只要知道:

初始状态:A上有n个盘子,B为空,C为空。

第一步,把A上的n-1个盘子移动到B;第二步,把A上的第n个盘子移动到C;第三步,把B上的n-1个盘子移动到C。搞定!

假设实现每次移动操作的函数为move($a,$b,$c,$n),则php实现代码如下:

 

<?php

$n = isset($_GET['num']) && is_numeric($_GET['num']) ? $_GET['num'] : 1;

function move($a,$b,$c,$n){

if ($n === 1) {

echo "move disk $n from $a to $c <br />";

}else{

move($a,$c,$b,$n-1);

echo "move disk $n from $a to $c <br />";

move($b,$a,$c,$n-1);

}

}

move('A','B','C',$n);

取$n=3,http://studyphp.cc/1226/03.php?num=3。结果如下:

move disk 1 from A to C 
move disk 2 from A to B 
move disk 1 from C to B 
move disk 3 from A to C 
move disk 1 from B to A 
move disk 2 from B to C 
move disk 1 from A to C

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值