递归算法
什么是递归
先下定义:递归算法是一种直接或者间接调用自身函数或者方法的算法。
通俗来说,递归算法的实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法来表示问题的解。它有如下特点:
- 一个问题的解可以分解为几个子问题的解
- 这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样
- 存在递归终止条件,即必须有一个明确的递归结束条件,称之为递归出口
其实说白了,就是递归方法本身调用自己而进行的运算,下面举个例子说明一下这个例子就是很著名的——斐波那契数列。
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368……
可以看出来第三个数就是前面两个数相加从而得到的。
如果使用正常的循环进行解决的话就是这样:
public class FeiBo{
public static void main(String[] args) {
int num1=0;
int num2=1;
int numn=1;
int n=10;
for (int i = 3; i <=n; i++) {
numn=num1+num2;
num1=num2;
num2=numn; }
System.err.println(n+"个数的结果为:"+numn);
}
使用递归的话是这样:
public class Demo {
public static int f(int n) throws Exception {
if(n==0){
throw new Exception("参数错误!");
}
if (n == 1 || n == 2) {
return 1;
} else { return f(n-1)+f(n-2);//自己调用自己 }
}
public static void main(String[] args) throws Exception {
for (int i = 1; i <=10; i++) {
System.out.print(f(i)+" ");
}
} }
【递归需要结束条件,到情况下递归就不需要继续调用,结束递归。上面案例结束条件就是当n=1或者2的时候,就返回0或者1,而不是继续调用递归方法本身了。
递归最主要的两个条件就是,自己调用自己,结束递归的条件。
因为递归是自己调用自己所以浪费资源大,运行时间比循环长很多,运行慢,效率底。】
例题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第3个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
答:假设给兔子的对数编号
第一个月:1 , sum=1;
第二个月:1 ,sum=1;
第三个月:1生2,sum=2;
第四个月:1生3,2,sum=3;
第五个月:1生4,2生5,3,sum=5
第六个月:1生6,2生7,4,5,3生8,sum=8;
第七个月:1生9,6,2生10,7,3生11,8,3生11,4生12,5生13,sum=13
…
用递归形式编码来表示为:
public class Main {
public static int f(int n){
if(n==1 || n==2){
return 1;
}
else
return f(n-1)+f(n-2);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
int n = input.nextInt();
System.out.println(f(n));
}
}