帮我解释一下这段代码(递归),在线等!!!!

来源:百度知道 编辑:UC知道 时间:2024/05/05 10:06:53
public class TT {
public static void main(String[] args) {
D ddddd=new D();
ddddd.hano4(2, 'A', 'B', 'C');
}
}
class D {
int num = 4;
public void hano4(int num, char first, char second, char third) {
if (num == 1) {
System.out.println(first + "-->" + third);

} else {
hano4(num-1, first, third, second);

System.out.println(first + "-->" + third);

hano4(num-1, second, first, third);
}

}
}
当num等於1,那么执行完if中的System.out.println(first + "-->" + third)则应该退出了啊,为何还会执行else中的System.out.println(first + "-->" + third);
呢???

因为num=2,所以执行else里面的语句hano4(num-1, first, third, second),在这方法里面num-1变为1,执行System.out.println(first + "-->" + third)输出A-->B;完成后跳出,num还是等于2,继续执行System.out.println(first + "-->" + third)输出A-->C,继续执行遇到hano4(num-1, second, first, third)时,num-1为1,再输出B-->C,程序结束.最后执行的System.out.println(first + "-->" + third)不是在else里面,而是if (num == 1) {
System.out.println(first + "-->" + third);

}里面的println(first + "-->" + third)

一看就知道你这个是有名的汉诺塔问题:
可以看看这个:
http://www.rocsky.net/blog/read.php/244.htm
汉诺塔(又称河内塔)问题是印度的一个古老的传说。开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。解答结果请自己运行计算,程序见尾部。面对庞大的数字(移动圆片的次数)18446744073709551615,看来,众僧们耗尽毕生精力也不可能完成金片的移动。

后来,这个传说就演变为汉诺塔游戏:

1.有三根杆子A,B,C。A杆上有若干碟子
2.每次移动