public class Test41 { //暴力递归就是尝试 //把问题转化为规模缩小了的同类问题的子问题 //有明确的不需要继续进行递归的条件 //得到了子问题的结果后的决策过程 //不记录每个子问题的解 //题目:打印n层汉诺塔从最左边到最右边的全部过程 //法1:暴力递归 public static void hanoi1(int n){ leftToRight(n); } //1到n层圆盘左到右(主函数) public static void leftToRight(int n){ if(n == 1){ System.out.println("Move 1 from left to right"); return; } leftToMid(n -1);//1到n-1层圆盘从左移到中间 System.out.println("Move" + n + "from left to right");//第n层圆盘从左移到右边 midToRight(n -1);//再把中间1到n-1层圆盘移到右边 } //1到n层圆盘左到中 public static void leftToMid(int n){ if(n == 1){ System.out.println("Move 1 from left to mid"); return; } leftToRight(n -1);//先把1到n-1层圆盘从左移到右 System.out.println("Move" + n + " from left to mid");//把n层圆盘从左移到中间 rightToMid(n -1);//把1到n-1层圆盘从右移到中间 } //1到n层圆盘右到中 public static void rightToMid(int n){ if(n == 1){ System.out.println("Move 1 from right to mid"); return; } rightToLeft(n -1); System.out.println("Move" + n + " from right to mid"); leftToMid(n -1); } //1到n层圆盘右到左 public static void rightToLeft(int n){ if(n == 1){ System.out.println("Move 1 from right to mid"); return; } rightToMid(n -1); System.out.println("Move" + n + " from right to mid"); midToLeft(n -1); } //1到n层圆盘中到左 public static void midToLeft(int n) { if(n == 1){ System.out.println("Move 1 from mid to left"); return; } midToRight(n -1); System.out.println("Move" + n + " from mid to left"); rightToLeft(n -1); } //1到n层圆盘中到右 public static void midToRight(int n){ if(n == 1){ System.out.println("Move 1 from mid to right"); return; } midToLeft(n -1); System.out.println("Move" + n + " from mid to right"); leftToRight(n -1); } //法2:从具体到抽象,不管左中右,只看from ,other ,to public static void hanoi2(int n){ if(n > 0){ func(n , "left" , "right" , "mid"); } } public static void func(int N , String from, String to, String other) { if(N == 1){ System.out.println("Move 1 from " + from + "to" + to); }else{ func(N -1 , from, other , to); System.out.println("Move" + N + " from " + from + "to" + to); func(N -1 , other , to, from); } } }
08-08
796
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)