使用Java实现汉诺塔问题~

简介: 使用Java实现汉诺塔问题~

我们设A为起始柱子,B为辅助柱子,C为目标柱子

由于盘子只能是大的放在下面,小的放在上面,因此,我们需要先将A柱子除了最下层的盘子都移动至B柱子

如下所示完成了最下层柱子到达它的最终位置,接下来,我们需要将B柱子上除了最下层的盘子之外的盘子移动至A,重复上述步骤


每次变化的点有两个:


1:柱子的功能


默认条件下,我们设置A为初始柱子,B为辅助柱子,C为目标柱子


设圆盘的个数为n


那么第一次我们需要将A柱子上的n-1个盘子借助C按照大小移动至B,由此B成为目标柱子,C为辅助柱子,当最下层的柱子到达C后,第一次完成(A为空柱子,B有n-1个盘子,C有1个盘子)


那么第二次我们需要将B柱子上的n-1-1个盘子借助A按照大小移动至C,由此C成为目标柱子,A为辅助柱子,当最下层的柱子到达C后,第二次完成(A有n-1-1个盘子,B为空柱子,C有2个盘子)



我们可以将除了最下层之外的n-1个圆盘看作一个整体,其实也就是2个盘子移动的问题,内部就是一个不断递归的过程


2:圆盘的数量


需要移动的圆盘的数量每次完成之后-1,而到达最终位置的圆盘数量每次完成之后+1

实现:

import java.util.Scanner;
public class test10 {
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            System.out.println("请输入圆盘的数量");
            int num = in.nextInt();
            hanoi(num, 'A', 'B', 'C');//起始柱、辅助柱、目标柱默认为A、B、C
        }
        public static void hanoi(int num, char a, char b, char c){
            if (num == 1) {
                System.out.println("第" + num + "个圆盘从" + a + " -> " + c);
            }else{
                //每当有一个盘子到达最终位置,目标柱和起始柱就要发生变化
                hanoi(num - 1, a, c, b);
                System.out.println("第" + num + "个圆盘从" + a + " -> " + c);
                hanoi(num - 1, b, a, c);
            }
        }
    }
请输入圆盘的数量
3
第1个圆盘从A -> C
第2个圆盘从A -> B
第1个圆盘从C -> B
第3个圆盘从A -> C
第1个圆盘从B -> A
第2个圆盘从B -> C
第1个圆盘从A -> C
相关文章
|
7月前
|
Java
【汉诺塔】经典递归问题(Java实现)图文并茂讲解
【汉诺塔】经典递归问题(Java实现)图文并茂讲解
|
6月前
|
Java
汉诺塔(java)
汉诺塔(java)
|
Java
java实现汉诺塔问题
java实现汉诺塔问题
276 0
|
Java C语言
逻辑训练--经典汉诺塔问题(C和JAVA递归实现)
逻辑训练--经典汉诺塔问题(C和JAVA递归实现)
汉诺塔问题(Hanoi Tower)--递归典型问题--Java版(图文详解)
汉诺塔问题(Hanoi Tower)--递归典型问题--Java版(图文详解)
|
Java
Java递归基础案例-汉诺塔
Java递归基础案例-汉诺塔
94 0
Java递归基础案例-汉诺塔
|
Java
经典汉诺塔java
经典汉诺塔java
94 0
经典汉诺塔java
|
Java
Java递归实现汉诺塔问题
汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。
139 0
|
机器学习/深度学习 Java
【Java】经典递归专项题图文讲解(详解经典汉诺塔问题)(二)
思路: 这题主要就是要找到递归公式,阶乘的递归公式还是很好找的,较为明显 递归公式为 n ×(n-1)! 终止条件为 n==1
【Java】经典递归专项题图文讲解(详解经典汉诺塔问题)(二)