数据结构--汉诺塔递归Java实现

 1 /*汉诺塔递归
 2  * 1.将编号0-N-1个圆盘,从A塔座移动到B上面
 3  * 2.将编号N的1个圆盘,从A移动到C上面
 4  * 3.最后将B上面的N-1个圆盘移动到C上面
 5  * 注意:盘子的编号从上到下1-N
 6  * */
 7 public class HannoTower_Recursion {
 8
 9     public static void main(String[] args) {
10         int nDisk = 3;
11         doTowers(nDisk,‘A‘,‘B‘,‘C‘);
12
13     }
14
15     private static void doTowers(int topN, char from, char inter, char to) {
16         if(topN == 1){
17             //只有一个盘子编号为1,直接从A移动到C上面
18             System.out.println("Disk 1 " + "from " + from + " to " + to);
19         }
20         else{
21             //将前N-1个盘子从A移动到B---from-->inter
22             doTowers(topN-1, from, to, inter);
23             //将第N个盘子从A移动到C---from-->to
24             System.out.println("Disk " + topN  + "from " + from + " to " + to);
25             //将前N-1个盘子从B移动到C---inter-->to
26             doTowers(topN-1, inter, from,to );
27         }
28     }
29
30 }

执行过程和结果

Enter(3 disks,A B C)

  Enter(2 disks,A,C,B)

    Enter(1disk,A B C)

    Base case-->disk1 from A---C   //Disk 1 from A to C

    Return(1disk A B C)

    move disk 2 from A--B    //Disk 2from A to B

    Enter(1disk, C,A,B)

    Base case-->disk1 from C---B   //Disk 1 from C to B

    Return(1disk C A B)

  Return(2disk A C B)

  move disk 3 from A--C    //Disk 3from A to C

  Enter(2disk B A C)

    Enter(1disk B C A)

    Base case-->disk1 from B---A   //Disk 1 from B to A

    Return(1disk B C A)

    move disk 2 from B--C    //Disk 2from B to C

    Enter(1disk A B C)

    Base case-->disk1 from A---C   //Disk 1 from A to C

    Return(1disk A B C)

  Return(2disk B A C)

Return(3 disks,A B C)

时间: 2024-10-08 04:45:24

数据结构--汉诺塔递归Java实现的相关文章

【数据结构与算法】汉诺塔算法——java递归实现

汉诺塔的递归实现算法,将A中的圆盘借助B圆盘完全移动到C圆盘上, 每次只能移动一个圆盘,并且每次移动时大盘不能放在小盘上面 递归函数的伪算法为如下: if(n == 1)    直接将A柱子上的圆盘从A移动到C else    先将A柱子上的n-1个圆盘借助C柱子移动到B柱子上    直接将A柱子上的第n个圆盘移动到C柱子上    最后将B柱子上的n-1个圆盘借助A柱子移动到C柱子上 该递归算法的时间复杂度为O(2的n次方),当有n个圆盘时,需要移动圆盘2的n次方-1次 public class

数据结构--汉诺塔--借助栈实现非递归---Java

1 /*汉诺塔非递归实现--利用栈 2 * 1.创建一个栈,栈中每个元素包含的信息:盘子编号,3个塔座的变量 3 * 2.先进栈,在利用循环判断是否栈空, 4 * 3.非空情况下,出栈,检查是否只有一个盘子--直接移动,否则就模拟前面递归的情况--非1的情况 5 * 4.直到栈空就结束循环,就完成全部的移动. 6 * */ 7 class Stack11{ 8 Towers[] tt = new Towers[20]; 9 int top = -1; 10 11 public boolean i

汉诺塔递归实现

经典问题汉诺塔的实现中,递归实现可以说是代码量最少,并最简单易懂的实现方法了. 假设有三根柱子a,b,c.其中a柱子上有n个金片.我们的目的就是把n个金片借助b,全部移动到c上.这是一个汉诺塔问题. 这个问题可以分解成如下子问题: (1)将n-1个金片从a移动到b.这又是一个汉诺塔问题. (2)上面执行完之后,可以直接将第n个金片移动到c. (3)上面两步执行完之后,将n-1个金片从b移动到c.这又再次是一个汉诺塔问题. 很显然,把上面的步骤翻译成递归形式可以得到如下的程序: 1 #includ

汉诺塔递归

#一日一词# 今天在学习Python的时候,遇到了递归问题,案例呢就是经典的汉诺塔游戏,表示虽然以前就接触过这游戏,解起来也很容易,不过放在编程里,几行的代码可够我手推了一个多小时.╭∩╮(︶︿︶)╭∩╮ 当然也是感受到了搞清楚一个(我认为的)难题的乐趣,心情大好,买条裤子. (表示从晚上一直整理到第二天,电脑没电所以今早发,生日与学习紧密结合)? 首先说下汉诺塔游戏,如下图,需要利用中间的柱子将左边的所有圆盘移动到最右边的柱子上,且和原来的大小上下顺序一致,移动过程中保证大盘永远在小盘下面.

经典汉诺塔递归实现

/*  * 为了将num个盘子从char移动到to,需要先将第num个盘子上面的num-1个盘子移动到temp上,  * 然后将第num个盘子移动到to上,最后将第N-1个盘子从temp移动到to上.这样通过递归  * 就可以实现汉诺塔问题的求解.  */ public static void HanuoTower(int num, char from, char temp, char to){ if(num==1){ System.out.println("从"+from+"

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

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

汉诺塔-递归

有三根柱子A,B,C A柱子上穿着N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小.要将所有圆盘移至C柱子,遵循以下规则: 1. 每次只能移动一个圆盘: 2. 小的上面不能放大的. 拆解问题,N个盘子,把最下面的那个大的看做地面,看成不存在,问题变为N-1汉诺塔问题 把下面两层看做不存在,就是N-2.... 方法就是: 先移动一个盘子(解决1汉诺塔问题) 在此基础上,解决2汉诺塔问题 .... .... 解决N-1汉诺塔问题 最终解决N汉诺塔问题 当然,递归是倒过来的,虽然思维是倒过来的,但实际

汉诺塔递归思维

汉诺塔比较经典的实现是利用递归,但也可以利用堆栈. 题意理解:有A,B,C三个柱子,将A柱子上的N个盘子(从大到小排列)移到C柱子上,每次只允许移动一个盘子,并且保证每个柱子上的盘子的排列都是从大到小. 1.递归实现 假设只有一个盘子,那么只需实现 A->C 这个动作: 如果有两个盘子,那么需要 (1)A->B; (2)A->C; (3)B->C; 如果有三个盘子,可以将前两个盘子看作一个盘子,对两个盘子重复以上三个步骤,于是得到N个盘子的递归算法,递归结束的条件是N=1: 1 v

数据结构---汉诺塔

/*汉诺塔:A座有n个盘子,下面直径比上面大,要借助C座,将n个盘子移到B上,移动过程中大盘子一定在小盘子下面*/ package pack; public class Main { static int n = 10; public static void main(String[] args) { han(n,'A','B','C'); //将n个盘子借助C,从A到B } public static void han(int n,char a,char b,char c) { if(n==1