说明:大家小时候想必都玩过汉诺塔的游戏吧,今天在这里有java语言解决这个问题,这是一个基本的递归的问题。问题是:有A,B,C 3根柱子在A柱子上放着从小到大的几个盘子,现在要把这些盘子从A柱子移动到C柱子上(每次移动只能移动一个盘子,而且在各自柱子上的盘子也只能是上面的小,下面的大)。
解法:对于递归想必大家最不能忍受的就是一不小心就进入了一个死循环,导致崩溃。其实对于递归,我想只要把握好递归终止条件的判断和对于递归的方法。弄清楚这两点就能说不会因为不断的循环而搞的自己的大脑受不了了。
过程:首先我考虑了这次递归的终止条件,很明显就是只有一个盘子在A柱子上的时候,移动方式也很简单:把A的第一个移动到C的第一个上去。(这里简但的记为A===>C 在java中的方法是handuo(int n ,char A,char B,char C)这里的n为1)
解决了第一个,那么想当然的有更多盘子的时候呢?头脑风暴下:我们先简化一下问题,我们可以把这些盘子分成两部分:最底下的一个是一部分,其他的是一部分,那么我们先把上面的那部分移动到B上面,然后将下面的部分移动到C上,那么好了最大的已经过去了,在将B上面的按照之前的顺序继续下去直到碰到终止条件。
好!思路有了。现在考虑细节,举例嘛,从简单的开始:现在在A上有两个盘子,该怎么移动呢? A===>B A===>C B===>C 3步搞定,好那么现在是考虑递归条件了:这里记只要移动一个盘子记为步骤一,好A===>B这一步用步骤一改怎么表示?很简单把B和C换个位置不就搞定了(用方法表示就是hannuo(int n-1 ,char A,char C,char B)这里的n为2),第二步A===>C根据我们上面的想法是固定的步骤,第三步根据第一步的想法我们只要把A和B换个位置就可以了,hannuo(int n-1 ,char B,char A,char C)。
简化为代码就是:
public void hanoi(int n, char A, char B, char C) {
if(n == 1) {
printf("Move sheet %d from %c to %c\n", n, A, C);
}
else {
hanoi(n-1, A, C, B);
printf("Move sheet %d from %c to %c\n", n, A, C);
hanoi(n-1, B, A, C);
}
}
这里我们可以拿3个盘子的情况来验证下此次的递归是不是正确的:首先我们把3个看成亮部分上和下,首先我们要把两个盘子移动到B柱子上,此时我想到了两个盘子的情况,把B看成是C不就好了,也就是
hannuo(int n-1 ,char A,char C,char B),接着是将A上最大的移动到C,最后在B上有两个,同理把B看成A进行两个盘子的移动就行了hannuo(int n-1 ,char B,char A,char C)。结果和代码的实现过程一样,那么也就证实了这个递归是正确的。
具体的代码:
import java.util.Scanner;
public class Towers_of_Hanoi {
<span style="white-space:pre"> </span>// 求解汉诺塔的方法 基本的递归问题
<span style="white-space:pre"> </span>private static void process(int n, char A, char B, char C) {
<span style="white-space:pre"> </span>if (n == 1) {
<span style="white-space:pre"> </span>System.out.println("Move " + A + " To " + C + " ;");
<span style="white-space:pre"> </span>} else {
<span style="white-space:pre"> </span>process(n - 1, A, C, B);
<span style="white-space:pre"> </span>System.out.println("Move " + A + " To " + C + " ;");
<span style="white-space:pre"> </span>// 这里也可以是process(1,A,B,C);
<span style="white-space:pre"> </span>process(n - 1, B, A, C);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>public static void findout(int n) {
<span style="white-space:pre"> </span>char A, B, C;
<span style="white-space:pre"> </span>A = 'A';
<span style="white-space:pre"> </span>B = 'B';
<span style="white-space:pre"> </span>C = 'C';
<span style="white-space:pre"> </span>process(n, A, B, C);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>public static void main(String[] args) {
<span style="white-space:pre"> </span>System.out.println("请输出你汉诺塔的层数:");
<span style="white-space:pre"> </span>Scanner sc = new Scanner(System.in);
<span style="white-space:pre"> </span>int n = sc.nextInt();
<span style="white-space:pre"> </span>findout(n);
<span style="white-space:pre"> </span>}
}