递归算法

递归算法

什么是递归
先下定义:递归算法是一种直接或者间接调用自身函数或者方法的算法。
通俗来说,递归算法的实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法来表示问题的解。它有如下特点:

  1. 一个问题的解可以分解为几个子问题的解
  2. 这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样
  3. 存在递归终止条件,即必须有一个明确的递归结束条件,称之为递归出口

其实说白了,就是递归方法本身调用自己而进行的运算,下面举个例子说明一下这个例子就是很著名的——斐波那契数列
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));
        }
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值