一、递归的概念
众所周知,在一个方法里可以调用一个或者多个方法。那么,一个方法是否可以调用其自身呢?没错,方法调用其自身的过程就是递归。
二、递归应用案例
1.阶乘
最简单的一个递归的应用是计算一个数的阶乘。阶乘的公式:
n!=n*(n-1)*(n-2)*...1. 例如:5!=5*4*3*2*1.
代码如下:
public static long jieCheng(int n) { if(n>1) return n*jieCheng(--n); else return 1; }
2.斐波那契数列
斐波那契数列的排列队形如:1,1,2,3,5,8,13,21,34.... 即:f(1)=1,f(2)=1,当n>2时,f(n)=f(n-1)+f(n-2)。
代码如下:
public long fibRecursion(int index) { if(index==1 || index==2) { return 1; } return fibRecursion(index-2)+fibRecursion(index-1); }
3.汉诺塔
假设有3个分别命名为X,Y,Z的塔座,在塔座X上插有n个直径大小各不相同、从上到下,从小到大编号为1,2,3...n个圆盘。现要求将X轴上的n个圆盘移至塔座Z上并仍按同样顺序叠排。圆盘移动时必须遵守下列规则:
a.每次只能移动一个圆盘;
b.圆盘可以插在X,Y和Z中的任一塔座上;
c.任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。
分析:
设F[n]表示将n个盘从按规则从X柱移到Z柱的步骤,显然,当n=1时,F[n]=1;当n>1时,我们将移动盘之的过程分为三步:
(1)将X柱上的n-1个盘依靠Z柱移到Y柱上,这个需要F[n-1]步;
(2)将X柱上剩下的一个盘(最大的盘)移到Z柱上,这个需要1步;
(3)将Y柱上的n-1个盘依靠X柱移到Z柱上,这个需要F[n-1]步。
代码如下:
public void hanoi(int level,String a,String b,String c) { if(level==1) { System.out.println("MOVE "+a+" TO "+c); } else { hanoi(level-1,a,c,b); //第一步,调用自身将n-1个盘子从A移到B System.out.println("MOVE "+a+" TO "+c); //第二步,将第n个(最下面最大的一个)盘子从A移到C hanoi(level-1,b,a,c); //第三步,调用自身将n-1个盘子从B移动到C } }
三、总结
递归的表现是多种多样的,可以只调用一次方法自身(例如:阶乘),也可以多次调用方法自身(例如:汉诺塔),还可以在方法内一个表达式中多次调用自身(例如:斐波那契数列)。