2019独角兽企业重金招聘Python工程师标准>>>
算法逻辑:
利用递归,当n为1时为递归出口,通过改变柱子的位置实现
当只有一个盘子时是从a(初始)->c(目的)
当有n个盘子时 先 (n-1)个a->b(中转) ; a->c
这时a空了,b上有 n-1个,c上有一个,这时就要把b的都搬到c上(当然不是一步)所以转换思想
把b当初始柱子,a 当中转柱子, c 还为目的柱子
为什么图片第15行是move(n - 1, a, c, b); (b c 换了下顺序)
就是因为当有n个盘子时 需要先 a->b(中转)
配合1行 System.out.println(a + "->" + c);(这里的a ,c 是函数的参数(这里的c为中转的b),通过变换参数位置就实现了变化。)
实现先把盘子转到中转盘子(先执行n==1 再往回执行递归的部分)
public class Testhnt {/*** @param n 汉诺塔的高度* @param a 初始的盘子所在柱子* @param b 进行中转的柱子* @param c 目的的柱子*/public void move(int n, String a, String b, String c) {if (n == 1) System.out.println(a + "->" + c);//递归出口else {move(n - 1, a, c, b);//n-1个a 移动到bSystem.out.println(a + "->" + c);//把a(初始) 上的盘子移动到c(目的)盘子move(n - 1, b, a, c);//把现在b上的(n-1)个盘子移动到c(目的柱子)利用现有的资源转换角度考虑}}public static void main(String[] args) {Testhnt t = new Testhnt();t.move(3, "A", "B", "C");}
}