递归(即递推与回归)
递归调用指的是该方法在执行的过程中遇到它自己本身的调用(即自己调用自己)
递归算法的两个条件:
1:含有递归出口(结束条件)
2:逐层递归向出口逼近
递归的思想:将一个大的事物分解成若干个小的事物且每一次使用的方法都相同
举例:
汉诺塔问题:
如图所示, 从左到右有A、B、C三根柱子,其中A柱子上面有从小到大的n个圆盘,现要求将A柱子上的原盘移到C柱子上去。
移动规则:
一次只能移动一个盘子且大盘子不能在小盘子上面,求移动的步骤和移动的次数
分析:
当A棒上只有一个盘子时,直接将这个盘子移到C棒上。
当A棒上有两个盘子时,先将A棒1号盘子(从上到下编号)移到B棒也就是辅助棒上,再将A棒上的2号盘子移到C棒上,最后将B棒上的盘子移到C棒上。
当A棒上有三个盘子时,先将A棒上编号1~2的两个盘子移到B棒上(这个过程需要借助C棒),然后再将A棒上编号为3的盘子移到C棒上,最后再借助A棒将B棒上的两个盘子移动到C棒上。
.....
当A棒上有n个盘子时,先将A棒上的前1~(n-1)个盘子移动到B棒上(需要借助C棒),然后再将A棒上编号为n的盘子移到C棒上,最后再借助A棒将B棒上的n-1个盘子移动到C棒上
综上所述:当且仅当只有一个盘子时不需要借助辅助棒,其余情况均一样
这时我们就可以采用递归算法来解决这个问题:
/**
*
* @param num :圆盘个数
* @param start : 起始棒
* @param help : 辅助棒
* @param dest : 目标棒
*/
public static void hanoi(int num,char start,char help,char dest){
if(num==1){ //当只有一个盘子时直接移动
count++;
System.out.println("第"+count+"次移动,从"+start+"棒移动到"+dest+"棒");
}else{
hanoi(num-1,start,dest,help); //借助C棒将n-1个圆盘移动到B棒上
count++;
System.out.println("第"+count+"次移动,从"+start+"棒移动到"+dest+"棒");
hanoi(num-1,help,start,dest);
}
}
}