1.一个函数对于其它函数来讲至关于一个盒子,他封装了其中的内容,其它函数只知道给它参数,而后获得它的结果。就比如一个作蛋糕的商店:咱们只须要知道给钱,它就会给蛋糕。而咱们不须要理解他们是怎么作出来的这个蛋糕。函数
2.调用的过程,就至关于上面例子中咱们去买蛋糕的过程。谁说本身不能买本身店里的蛋糕呢?好比你是作蛋糕的,难道你不能买本身店里的蛋糕吗?函数的自我调用(递归?)也是这么回事情。设计
对于hanoi类里面,两个核心函数:递归
move(char getme, char purone):three
这个函数的功能是:把getme最上面的盘子移动到purone位置,好比 move('A','B')就是把A柱子最上面那个盘子移动到B柱子的最上面。utf-8
hanoi(int n,char one,char two,char three):get
这个函数的功能是:如今在柱子one上一共有n个盘子,这个函数可以经过two把它移动到three上面。 如今你了解了这两个函数设计的初衷,ok,咱们来分别实现每一个函数。数学
public void move(char getme,char purone) {移动
//请联系上面写的这个函数的功能来看: c=c+1;//咱们每移动一步,就计数一次co
System.out.println(getme+"-->"+putone+"搬盘次数为:"+c); //这行使用输出来代表移动过了(事实上hanoi就是要让你详细说明移动过程,所谓“说明”,就是打印出每次的移动,那这里咱们就把此次移动打印出来,这个没有任何问题吧?这个函数就是要把移动这件事情说出来,明白?return
}
public void hanoi(int n,char one,char two,char three) {
//请回忆hanoi函数的功能,是要把one柱子上的前n个放到three柱子上:
if(n==1) //若是n==1,那也就是要把one柱子上最上面的那个移到three上面了,这就是move函数的做用,对吧?那就直接调用
move(one,three) move(one,three);
else{ //若是n>1的话,那咱们该怎么办? 分为三个步骤:
1.先想办法把one主子上的前n-1个移动到柱子two上
2.而后把one柱子上的第n个移动到柱子three上。
3.而后想办法把two柱子上的n-1个移动到three上。
对吧?如今你注意到第1步和第3步是否是就是hanoi这个函数的功能可以实现的呢?回答显然是确定的,下面就是这三步。
hanoi(n-1,one,three,two); //把one柱子上的n-1个经过three移动到two上。
move(one,three); //把one主子上最上面那个(注意,上面一步已经把前n-1个移动到two上面了,one柱如今最上的那个就是第N个)
hanoi(n-1,two,one,three);//把two柱子上的n-1个移动到three柱子上。
}
} 解释到这里,main函数里面的调用应该也就很明白了吧?
a.hanoi(m,'A','B','C'); 把'A'柱子上的m个盘子经过'B'柱子所有移动到'C'上面的步骤。 解释起来很容易,想得多了也就慢慢明白了,最难的是如何设计一个递归出来。这个和数学里面的递推公式很类似(事实上其来源就是递推公式),想必你确定知道递增函数把?
An = An-1 + 5(A0 = 0 );这个条件可以惟一肯定一个数列。 那如今你把它写成函数呢?
int A(int n) {
if(n == 0) {
return 0;
} else {
return A(n -1) + 5;
}
}