汉诺塔问题(函数的递归)
1.汉诺塔:
法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。(如图,看得一脸懵逼,不慌,大佬带你飞,往下看)。
2.汉诺塔的编程解决算法:递归实现
要理解什么是递归,在第五章里面已经总结了函数的递归:函数的递归就是指函数自身调用自身。
汉诺塔动画流程:
整个汉诺塔在移动的过程中主要注意的是:想要最大的移到最后就必须让请几个在出去在中间,保证最后面是空的,才可以移最大的一个。例如,四个盘子,想要挪第四个最大的到最后,就必须让前三个在中间。
四个盘子的详细过程:
前4个 x->z
前3个 x->y
前2个 x->z
前1个 x->y
第2个 x->z
前1个 y->z
第3个 x->y
前2个 z->y
前1个 z->x
第2个 z->y
前1个 x->y
第4个 x->z
前3个 y->z
前2个 y->x
前1个 y->z
第2个 y->x
前1个 z->x
第3个 y->z
前2个 x->z
前1个 x->y
第2个 x->z
前1个 y->z
3.代码段实现:
public class Sample {
/*
汉诺塔问题
前4个 x->z
前3个 x->y
前2个 x->z
前1个 x->y
第2个 x->z
前1个 y->z
第3个 x->y
前2个 z->y
前1个 z->x
第2个 z->y
前1个 x->y
第4个 x->z
前3个 y->z
前2个 y->x
前1个 y->z
第2个 y->x
前1个 z->x
第3个 y->z
前2个 x->z
前1个 x->y
第2个 x->z
前1个 y->z
*/
public static void main(String[] args) {
String x = "x";
String y = "y";
String z = "z";
hano(4,x,y,z);
}
public static void hano(int level, String begin, String mid, String end) {
if (level == 1) {
System.out.println(begin + "->" + end);
} else {
//前面level - 1
hano(level - 1, begin,end,mid);
System.out.println(begin + "->" + end);
hano(level - 1, mid,begin,end);
}
}
}
注:
hano(level - 1, begin,end,mid);
//保证请几个最终要落在中间(中途借助end位置移动)
System.out.println(begin + “->” + end);
//把最大的一个直接挪到最后
hano(level - 1, mid,begin,end);
//归位,保证中间的最后移到最后(中途借助begin位置移动)
运行结果: