1. 递归介绍
定义:函数或者方法,直接或者间接调用函数本身,则称该函数或者方法为递归函数或者递归方法。
2.举例
2.1 斐波那契数列
斐波那契数列:1,1,2,3,5,8,13,21…类似于这样后面一个数是前面两个数的和,这是一个典型的递归问题。
public class Feibonacci {
public static void main(String[] args) {
System.out.println(feibonacci(4));
}
//返回第n项斐波那契数列
public static int feibonacci(int n){
if(n==1||n==2){
return 1;
}else{
return feibonacci(n-2)+feibonacci(n-1);
}
}
}
2.2 汉诺塔问题
如下图所示,将A柱子的圆盘移动到C柱子,但是有一个规则:只能是小的圆盘放在大的圆盘上面,不能大的圆盘放在小的圆盘上面。
分析:经过思考后发现,这是一个比较典型的递归问题,可以将该问题总结为两种情况:第一种:只有一个盘子时,直接将盘子从A柱子移动到C柱子。第二种:当有两个或者两个以上的盘子时,第一步:将A柱子的盘子分为两种类型,即为上面的所有盘子和最下面的一个盘子,借助C柱子的作用,先将A柱子上面的所有盘子移动到B柱子,然后将最下面的盘子移动到C柱子;第二步:将B柱子上面的盘子用类似于A柱子的方法,移动到C柱子。
public class Hanoita {
public static void main(String[] args) {
hanoi(3,'A','B','C');
}
public static void hanoi(int i,char from,char in,char to){
if(i==1){
System.out.println("第1个盘子从"+from+"移动到"+to);
}else{
//将盘子分为上面所有的盘子和最下面的一个盘子
//1.将上面所有的盘子移动到中间的柱子
hanoi(i-1,from,to,in);
//2.将最下面的盘子,移动到最右边的柱子
System.out.println("第"+i+"盘子从"+from+"移动到"+to);
//3.将上面的所有盘子从中间的柱子移动到最右边的柱子
hanoi(i-1,in,from,to);
}
}
}