数据结构(java语言描述)递归实现——汉诺塔问题

1.汉诺塔问题描述

N阶汉诺塔:假设有3个分别命名为x,y,z的三个塔座,在x上有n个盘子,直径大小不同,有小到大按标号1,2,3...n排列,要借助y将n个盘子转移到z上,期间不能让小盘子压在大盘子上。规则:

  • 每次至移动一个盘子;
  • 盘子可以插在x,y,z任意一个塔座上;
  • 任何时候都不能将大盘压在小盘上。

2.解题思路

当n=1时,直接把盘子由x——>z;

当n>1时,需利用y,首先将(n-1)个盘子由x——>y,把第n个实现x——>z,然后把问题转换为实现(n-1)个盘子由y——>z,借助x;

实现n个盘子由x到z的时候,先把n-1个搬到y上,把第n个搬到z上;然后再借助z,把n-1个盘子搬回x.

循环实现(n-1)个盘子由x到z.

注意:最初递归中涉及到搬盘子都用move()实现一落盘子中最大的那一个,可以在此坐标记。

3.代码

package hanoi;
public class hanoi {
    private int c=0;
    public void hanoi(int n,char x,char y,char z){
        if (n==1)
        {
            move(x,1,z);
        }else
        {
            hanoi(n-1,x,z,y);
            move(x,n,z);
            hanoi(n-1,y,x,z);
        }
    }    
public void move(char x,int n,char z){
    System.out.println("第"+ ++c +"次移动:"+n+"号盘子,"+x+"——>"+z);
}
public static void main(String[] args){
    hanoi e=new hanoi();
    e.hanoi(5, ‘x‘, ‘y‘, ‘z‘);
}
}

n=4时,运行结果:

第1次移动:1号盘子,x——>y
第2次移动:2号盘子,x——>z
第3次移动:1号盘子,y——>z
第4次移动:3号盘子,x——>y
第5次移动:1号盘子,z——>x
第6次移动:2号盘子,z——>y
第7次移动:1号盘子,x——>y
第8次移动:4号盘子,x——>z
第9次移动:1号盘子,y——>z
第10次移动:2号盘子,y——>x
第11次移动:1号盘子,z——>x
第12次移动:3号盘子,y——>z
第13次移动:1号盘子,x——>y
第14次移动:2号盘子,x——>z
第15次移动:1号盘子,y——>z

时间: 2024-08-05 02:55:18

数据结构(java语言描述)递归实现——汉诺塔问题的相关文章

16、蛤蟆的数据结构笔记之十六栈的应用之栈与递归之汉诺塔问题

16.蛤蟆的数据结构笔记之十六栈的应用之栈与递归之汉诺塔问题 本篇名言:"人生的价值,并不是用时间,而是用深度去衡量的." 继续栈与递归应用,汉诺塔问题. 欢迎转载,转载请标明出处: 1.  汉诺塔问题 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一

20150410 递归实现汉诺塔算法

20150410 递归实现汉诺塔算法 2015-04-10 Lover雪儿 1 //汉诺塔 2 #include <stdio.h> 3 4 static int i = 0; 5 6 //将n个盘子从x借助y移动z 7 //n:移动的个数 x:源地址 y:中间柱子 z:目的柱子 8 void move(int n, char x, char y, char z) 9 { 10 if(1 == n){ 11 printf("第%d次移动 %c--->%c\n", ++

递归__汉诺塔

要将n个盘子从a 通过b 移动到c那么 就要先将 n-1个盘子从a通过c 移动到b再将a最底下的盘子移动到 c之后再将 n-1个盘子从b通过a移动到c由此可得到 递归公式hanoi(int n,char from,char denpend_on,char to):{ //n:盘子数from:a,denpend_on:b,to:c //此语句意义为 将n个盘子从from 通过 denpend_on移动到tohanoi(n-1,from,to,denpend_on);move(n,from,to);

Python递归实现汉诺塔

Python递归实现汉诺塔: def f3(n,x,y,z): if(n==1): print(x,'--->',z) else: f3(n-1,x,z,y) print(x,'--->',z) f3(n-1,y,x,z) n=int(input('请输入汉罗塔层数:')) f3(n,'X','Y','Z') 运行结果如下:

递归求汉诺塔的解

递归求汉诺塔的解 // 递归求汉诺塔的解.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<stdio.h> #include<conio.h> #include<windows.h> void HanoiTower(int,char,char,char); void main() { int n; char A='A',B='B',C='C'; printf("---Hanoi To

Go基础之函数递归实现汉诺塔

Go递归实现汉诺塔 package main import "fmt" // a 是源,b 借助, c 目的长度 func tower(a, b, c string, layer int) { if layer == 1 { fmt.Println(a, "111->", c) return } // n-1 个 a 借助 c 到 b tower(a, c, b, layer-1) fmt.Println(a, "11->", c)

Java 递归实现汉诺塔问题

汉诺塔问题就是:有ABC三根柱子,A柱子上从上到下摞了很多体积依次递增的圆盘,如果将圆盘从A移动到C柱子,且依然保持从上到下依次递增. class Hanio{ public void moveOne(int n, String init, String desti){ //只有一个盘子的情况 System.out.println(" move:"+n+" from "+init+" to "+desti); } public void move

递归理解-汉诺塔问题

汉诺塔问题 汉诺塔问题的求解可以巧妙利用递归思想 以下摘自知乎上我认为阐述得很清除回答: 要用程序来解决这个问题,我们先定义一个移动函数:move(移动数,开始柱,中转柱,目标柱), 例如 move(2,A,B,C) 表示将2个盘子从A柱(开始柱)借助B柱(中转柱)移动到C柱(目标柱). 关于开始柱,中转柱,目标柱这三个概念可以用移动过程中的某个状态来理解, 看下面一张图应该就能明白: 有三种状态的柱子,开始柱,中间柱,目标住,开始柱指的是开始状态时存放所有盘子的柱子,中转柱指的是中间状态时暂时

递归之汉诺塔问题

有三根杆子A,B,C.A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小.要求按下列规则将所有圆盘移至C杆: 每次只能移动一个圆盘: 大盘不能叠在小盘上面. 提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则. 问:如何移?最少要移动多少次? 这个问题也就是著名的汉诺塔问题,以上对问题的描述摘于维基百科(因为懒,所以不手打了),对于这个问题的详细描述请点击一下维基百科的页面. 对于这个问题,刚开始确实不太好理解,不过我们可以从三个圆盘开始,最简单的方法