汉诺塔问题php解决

面向过程解决

<?php
function hanio($n,$x,$y,$z){//把n个盘子,按照要求从x移到z,y是中介
	//递归跳出条件
	if($n==1){
		move($n, $x, $z);
	}else{
		//这三部是核心
		hanio($n-1, $x, $z, $y);
		move($n, $x, $z);
		hanio($n-1, $y, $x, $z);
	}
}

function move($n, $x, $y){
	$format = ‘把%d从%s移动到%s‘;
	printf($format,$n,$x,$y);
	echo "<br/>";
}

hanio(2, ‘A‘, ‘B‘, ‘C‘);
?>

  面向过程写

<?php
class Hanio{
	private $n;//规模
	private $start;//起始柱子
	private $mediator;//中介柱子
	private $goal;//目标柱子
	private $format = ‘把%d从%s移动到%s‘;
	public function __construct($n,$start,$mediator,$goal){
		$this->n = $n;
		$this->start = $start;
		$this->mediator = $mediator;
		$this->goal = $goal;
	}

	//单个盘移动
	private function move($n,$start,$goal){
		printf($this->format,$n,$start,$goal);
		echo "<br/>";
	}

	public function getResult(){
		$this->handle($this->n,$this->start,$this->mediator,$this->goal);
	}

	private function handle($n,$x,$y,$z){
		//递归跳出条件
		if($n==1){
			$this->move($n, $x, $z);
		}else{
			//这三部是核心
			$this->handle($n-1, $x, $z, $y);
			$this->move($n, $x, $z);
			$this->handle($n-1, $y, $x, $z);
		}
	}

}

class Client{
	public static function main(){
		$hanio = new Hanio(4, ‘A‘, ‘B‘, ‘C‘);
		$hanio->getResult();
	}
}

Client::main();
?>

  

时间: 2024-10-10 05:48:03

汉诺塔问题php解决的相关文章

2019.1.8兔子问题和汉诺塔问题的解决代码

#兔子问题用递归法解决 def factorial(n): if n<1: print("输入有误,请返回重新输入!") return -1 if n==1 or n==2: return 1 else: return factorial(n-1)+factorial(n-2) number=int(input("请输入兔子繁殖的朋数:")) result=factorial(number) if result !=-1: print("%d月后生%

C++ 汉诺塔问题

汉诺塔问题,是心理学实验研究常用的任务之一.当然我们是学计算机的,因此我们尝试用计算机去求解它. 例题 openjudge6261 汉诺塔问题 描述 有一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下.由小到大顺序串着由n个圆盘构成的塔.目的是将最左边杆上的盘全部移到中间的杆上,条件是一次只能移动一个盘,且不允许大盘放在小盘的上面.这就是著名的汉诺塔问题. 假定圆盘从小到大编号为1,2,3,-- 输入 输入为一个整数后面跟三个单字符字符串. 整数为盘子的数目,后三个字符表示三个杆子的编号

汉诺塔递归解决方法经典分析

一位法国数学家曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面.僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔.庙宇和众生也都将同归于尽. 虽然这只是一个传说,但也给我们提出了一个问题,

【Python学习】Python解决汉诺塔问题

参考文章:http://www.cnblogs.com/dmego/p/5965835.html 一句话:学程序不是目的,理解就好:写代码也不是必然,省事最好:拿也好,查也好,解决问题就好! 信息时代不用信息就是罪过,直接抄不加理解与应用,就不是自己的,下次遇到还是不会,或许其中的某一个细节就能够用于各个问题的解决,共勉 学习一个东西总会遇到一些经典的问题,学习Python第二天尝试看一下汉诺塔问题,还是百度,看看解题思路,纯粹是重温初中课堂,越活越回去了 汉诺塔的图解递归算法 一.起源: 汉诺

编程:递归编程解决汉诺塔问题(用java实现)

//Li Cuiyun,October 14,2016.//用递归方法编程解决汉诺塔问题package tutorial_3_5;import java.util.*; public class HanoiTower { public static void main(String[] args) { // TODO Auto-generated method stub @SuppressWarnings("resource") Scanner sc=new Scanner(Syste

栈解决汉诺塔问题

汉诺塔问题比较经典,这里修改--下游戏规则: 现在限制不能从最左侧的塔直接移动到最右侧,也不能从最右侧直接移动到最左侧,而是必须经过中间. 求当塔有N层的时候,打印最优移动过程和最优移动总步数. 在走出最少步数过程中的任何时刻,四个动作中只有一个动作不违反小压大和相邻不可逆原则(相邻的两次操作不互为逆操作如:MtoR和RtoM),另外三个动作一定都会违反. #include <iostream> #include <stack> using namespace std; enum

【算法题】06-用栈来解决汉诺塔问题

用栈来解决汉诺塔问题 题目 修改汉诺塔问题的游戏规则:限制不能从最左侧的塔直接移动到最右侧,也不能从最右侧直接移动到最左侧,而是必须经过中间.求当塔有N层的时候,打印最优移动和最优移动总步数. 要求: 方法一:递归的方法 方法二:非递归的方法,用栈来模拟汉诺塔的三个塔 思路 方法一:递归的方法 首先,如果只剩最上层的塔需要移动,则有如下处理: 如果希望从左移动到右,打印Move 1 from left to right 如果希望从中移动到左,打印Move 1 from mid to left 如

C#递归解决汉诺塔问题(Hanoi)

using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace MyExample_Hanoi_{    class Program    {        static void Main(string[] args)        {            HanoiCalculator c = new HanoiCalculator();            Cons

递归解决汉诺塔问题

汉诺塔问题:有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,求至少需要多少次移动. 我们首先假设n=1,那么move(n)=1,因为这时候只需要从A->C便可以.接下来假设n=2,那么move(n)=3 即A->B,A->C,B->C; 假设n=3,move(n)=7 即A->C,A->b,C->B,A->C,B->A,B-