相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。 [2]
汉诺塔问题图示
汉诺塔问题图示 [2]
分析:对于这样一个问题,任何人都不可能直接写出移动盘子的每一步(以下代码的目是给出每一步),但我们可以利用下面的方法来解决。设移动盘子数为n,为了将这n个盘子从A杆移动到C杆,可以做以下三步:
(1)以C盘为中介,从A杆将1至n-1号盘移至B杆;
(2)将A杆中剩下的第n号盘移至C杆;
(3)以A杆为中介;从B杆将1至n-1号盘移至C杆。
这样问题解决了,但实际操作中,只有第二步可直接完成,而第一、三步又成为移动的新问题。以上操作的实质是把移动n个盘子的问题转化为移动n-1个盘,那一、三步如何解决?事实上,上述方法设盘子数为n, n可为任意数,该法同样适用于移动n-1个盘。因此,依据上法,可解决n -1个盘子从A杆移到B杆(第一步)或从B杆移到C杆(第三步)问题。现在,问题由移动n个盘子的操作转化为移动n-2个盘子的操作。依据该原理,层层递推,即可将原问题转化为解决移动n -2、n -3… … 3、2,直到移动1个盘的操作,而移动一个盘的操作是可以直接完成的。至此,我们的任务算作是真正完成了。而这种由繁化简,用简单的问题和已知的操作运算来解决复杂问题的方法,就是递归法。在计算机设计语言中,用递归法编写的程序就是递归程序。 [2]
汉诺塔问题是用递归方法求解的一个典型问题,在实际教学中,可以在传统教学方式的基础上,利用计算机辅助教学进行算法的模拟演示教学,使学生更容易接受和理解递归算法的思想,不但能提高学生的学习兴趣,而且还能取得较好的教学效果。
代码是把B作为to目标
java实现
import java.util.Scanner;
public class Hnuota {
static char from='A';
static char help='C';
static char to ='B';
static int n=0;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
H(n,from,help,to);
}
static void H(int n,char from,char help,char to) {
if(n==1) {
System.out.print(n+"盘从"+from+"移动到"+to+'\n');
return;}//如果没有return,n会一直减到负数
H(n-1,from,to,help);1)以B杆为中介,从A杆将1至n-1号盘移至C杆;
System.out.print(n+"盘从"+from+"移动到"+to+"\n");//(2)此时,可以将A杆中剩下的第n号盘移至B杆;
H(n-1,help,from,to);//(3)以A杆为中介;从B杆将1至n-1号盘移至B杆。
}
}