首页 > 技术文章 > 浅析递归

jebysun 2015-03-24 19:44 原文

一、递归的概念

  众所周知,在一个方法里可以调用一个或者多个方法。那么,一个方法是否可以调用其自身呢?没错,方法调用其自身的过程就是递归。

二、递归应用案例

  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
	}
}

三、总结

  递归的表现是多种多样的,可以只调用一次方法自身(例如:阶乘),也可以多次调用方法自身(例如:汉诺塔),还可以在方法内一个表达式中多次调用自身(例如:斐波那契数列)。

推荐阅读