这个问题最重要的就是要有递归的思想.
作为初学者的我对这个问题做了一些思考,最后我靠着自己的关于对递归的理解独立完成了这件事,希望你们收获自己独立思考后完成后的成就感.
基本思想:
1.不管最左边有多少层,就把它看成两层,最底下一层和除去最底下一层的所有其他层.(我把它们分别记作base0,^base0)
(画的丑了点,还请见谅,哈哈)
2.移动:
①^base0 from A to C
②base0 from A to B
③^base0 from C to A
3.好了,下面就是考虑^base0怎么移动了
道理是一样的,下面以拆分①的步骤为例
step1:^base1 from A to B
step2:base1 from A to C
step3:^base1 from B to C
读者有没有发现2中步骤与3中步骤十分类似(没找出来再仔细看看)
这时我们就可以把这三个步骤抽象为方法(函数)
下面放出最关键的递归函数
void f1(int n,char st,char ed){//st表示start,移动起始点;ed表示end,移动的结束点 if(n==0) return; char ne=next(st,ed); f1(n-1,st,ne); System.out.println(st+"to"+ed); f1(n-1,ne,ed); }
下面放出完整的源码
1 import java.util.Scanner; 2 public class Hanoi2 { 3 public static char next(char x,char y){ 4 if(x=='A'||y=='A'){ 5 if(x=='B'||y=='B'){ 6 return 'C'; 7 } 8 else return 'B'; 9 } 10 else return 'A'; 11 } 12 public static void f(int n,char st,char ed){ 13 if(n==0) return; 14 char ne=next(st,ed); 15 f(n-1,st,ne); 16 System.out.println(st+"to"+ed); 17 f(n-1,ne,ed); 18 } 19 public static void main(String[] args) { 20 Scanner sc=new Scanner(System.in); 21 int n=sc.nextInt(); 22 sc.close(); 23 f(n,'A','B'); 24 } 25 26 }