JAVA基础学习—方法
使用递归解决汉诺塔问题:
-
问题描述
在古印度神话,在贝纳勒斯的圣庙安放着一块铜板,板上有3根宝石针。梵天(印度教的主神)在创造世界的时候,在其的一根针上摆放了由小到大共64片中间有孔的金片。无论白天和黑夜,都有一位僧侣负责移动这些金片。移动金片的规则是:一次只能将一片金片移动到另一根针上,并且在任何时候及任意一根针上,小片只能在大片的上面。当64个金片全部由最初的那根针移动到另一根针上时,这世界就在一声霹雳中消失。如何使用递归模拟次?
-
算法:
假设A,B,C表示3根针,目的是将A上的铜片全部移动到C。- 将A上的n-1根铜片借助C全部移动到B
- 将A上的最后一个铜片移动到C
- 将B上的n-1根铜片借助A移动到C
-
程序实现:
{ public static void main(String args[]) { hanoi(3,'A','B','C'); } static void move(char a,char c) { System.out.println("from "+a+" to "+c); } static void hanoi(int n,char a,char b,char c) { if(n==1) move(a,c); else { hanoi(n-1,a,c,b); move(a,c); hanoi(n-1,b,a,c); } } }
* 运行结果:
>from A to C
from A to B
from C to B
from A to C
from B to A
from B to C
from A to C
+ 当有n铜片,需要执行 2^n-1步。