递归算法的条件有两个:
1.趋近于某一终止条件
2.循环调用自己本身
比如斐波那契数列的算法,fn=f(n-1)+f(n-2);
public class Dgui {
public static int fbnq(int n){
int f1=1;
int f2=1;
int f3=2;
for(int i=2;i<n;i++){
f3=f1+f2;
f1=f2;
f2=f3;
}
return f3;//斐波那契数列的算法,返回当前的斐波那契数
}
public static int fbnq1(int n){
if(n==1||n==2){
/*当n为1或者2时,只有f1=f2=1,则此时返回1
不可以直接写为if(n==3){
return 2;
}
因为后面算法在调用自身时会用到f1,f2,这样一些运行会报错
*/
return 1;
}
return fbnq1(n-1)+fbnq1(n-2);//f3=f1+f2,f4=f2+f3,f5=f3+f4……
}
public static void main(String[] args) {
int a=6;//表示要求第几个斐波那契数字
fbnq(a);
fbnq1(a);
System.out.println("普通方法结果: "+fbnq(a));//调用斐波那契数列的普通算法以作验证
System.out.println("递归方法结果:"+fbnq1(a));
}
}
运行结果:
汉诺塔问题:
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
此问题满足递归算法的条件,可以用递归算法来算,假设三个柱子分别时A,B,C,我们知道,当只有一个圆盘时,只需将圆盘从第一个柱子移到第三个柱子即可,只需要移动一次,而当有两个圆盘时,我们需要三次,先将A上那个小的从A移到B,再将A上那个大的从A移到C,然后将已经移到B上那个小的从B移到C,共三步
所以当有n个盘子时,可以将n个盘子理解为只有第n个和剩下的n-1个两部分(即把n-1看做一部分,把单个n看做一部分),那么,也需要三步,先将A上那个小的(n-1)从A移到B,再将A上那个大(n)的从A移到C,然后将已经移到B上那个小的(n-1)从B移到C,也是三步,
实现其过程的代码为:
package study;
//汉诺塔
public class HanNuoTa {
public static void han(char pos1,char pos3){
System.out.println(pos1+"--->"+pos3);
}
public static void nuo(int n,char pos1,char pos2,char pos3){
if(n==1){
han(pos1,pos3);
}
else{
nuo(n-1,pos1,pos3,pos2);/*把n个盘子看做两个整体部分,把n-1个盘看作一个整体,从塔1移到塔2;
把最大的那个盘n盘看作一个整体,从塔1移到塔3;
*/
han(pos1,pos3);
nuo(n-1,pos2,pos1,pos3);//把n-1看做一个整体从塔2移到塔3;
}
}
public static void main(String[] args) {
nuo(3,'A','B','C');
}
}
运行结果:
汉诺塔这个操作的时间复杂度为2^n-1,所以如果要算A上放64个盘子所需时间非常长,计算机也要二百多年才能算出来的。