汉诺塔问题:
相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如图1)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。
编程要求:
有A、B、C三根柱子,A为起始柱,B为辅助柱,C为目标柱,以及若干圆盘,圆盘按上小下大的顺序堆放在A柱上,从上到下依次为每一个圆盘标号为 1 到 n
输入圆盘数,要求将A柱的圆盘移动到C柱,一次只能移动一个,过程中可以任意使用三根柱子,但是要保证小圆盘始终在上
输出每一个圆盘每一步移动的过程,比如:1号圆盘从 A -> C
做题思路:
假设是有五个圆盘,int n 收入,则可把五个圆盘看作两个部分,最底层一个为n底层往上四个则为n-1:
做题步骤:
1.将n-1从A柱移动到B柱;
2.将n从A柱移动到B柱;
3.最后将n-1从B柱移动到C柱;
注意不止有两层所以这题使用递归思想,首先找到递归结束条件即n=1的时候(即只有一个圆盘)
得出直接从A柱移动到C柱。
代码实现
import java.util.Scanner;
public class hannuota{
//创建一个main方法
public static void main(String[] args){
Scanner myscanner = new Scanner(System.in);
T t = new T();
System.out.println("请输入要移动的盘子数");
int n = myscanner.nextInt();
t.move(n,'A','B','C');
}
}
class T{
public void move(int n,char a,char b,char c){//定义层数,盘子
if(n == 1){
System.out.println("第" + n + "个圆盘从" + a + "->" + c);//递归退出条件只有一个圆盘时从A柱移动到C柱
}else{
move(n - 1,a,c,b);//移动n - 1部分的圆盘从A->B
System.out.println("第" + n + "个圆盘从" + a + "->" + c);
move(n - 1,b,a,c);//移动n - 1部分的圆盘从A->B
}
}
}
总结
本题运用递归思想,分成n和n-1两部分,如果要深入继续往后递归,可能比较复杂,主要是想出本题的主要思想,可以入手前先从较少的圆盘数开始用穷举,慢慢得出规律,本人也是刚接触递归,做法可能欠缺希望能帮到你,如果有哪方面可以优化,望大佬指正