算法5分钟|浅入浅出递归

图片

目录

导读概述

什么是递归

递归三要素模板

DEMO:递归打印n数据

斐波那契数列

题目

解题

复杂度分析

复应用场景


导读概述

本文将从以下几个方面介绍递归算法:

 1.什么是递归

 2.递归三要素小技巧

 3.递归小demo

 4.斐波那契数列小案例

什么是递归

递归:在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。也就是说,递归算法是一种直接或者间接调用自身函数或者方法的算法。

递归特征:

  • 递归,去的过程叫"递",回来的过程叫”归“。

  • 递是调用,归是结束后回来。

是一种循环,而且在循环中执行的就是调用自己,递归调用将每次返回的结果存在栈帧中。

递归三要素模板

递归结束条件

既然是循环就必须要有结束,不结束就会OOM了。

函数的功能

这个函数要干什么,打印,计算....

函数的等价关系式

递归公式,一般是每次执行之间,或者与个数之间的逻辑关系。

DEMO:递归打印n数据

//递归打印遍历n数据
int diGui(int n) {
  //1.递归条件
  if(n<=0){
      return 0 ;
  }
  //2.函数功能
  System.out.println("递归调用 n:"+n);
  //3.函数等价式功能 自己调用自己
 return diGui(n-1);
}

输出结果:

//递归打印遍历n数据
public static void main(String[] args) {
        OMetch.diGui(5);
}
输出结果:
递归调用 n:5
递归调用 n:4
递归调用 n:3
递归调用 n:2
递归调用 n:1

斐波那契数列

题目

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:

斐波那契数列:0、1、1、2、3、5、8、13、21、34、55 ...

//递归打印遍历n数据
F(0) = 0,   
F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1

斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。

示例 1:

输入:n = 2
输出:1

示例 10:

输入:n = 10
输出:55

解题

规律:从第3个数开始,每个数等于前面两个数的和

递归分析:

函数的功能:返回n的前两个数的和

递归结束条件:从第三个数开始,n<=2

函数的等价关系式:fun(n)=fun(n-1)+fun(n-2)

解题代码如下:

/**斐波那契数列:
0、1、1、2、3、5、8、13、21、34、55.....
 * @author lihaoran 递归代码
 */
public class Fibonacci {
    public static int fun(int n){
        if(n<=1){
            return n;
        }
        return fun(n-1)+fun(n-2);
    }
}

结果:入参:10 输出55

public static void main(String[] args) {
    int fun = Fibonacci.fun(10);
    System.out.println(fun);
}
//入参10的位置
//输出结果 55

复杂度分析

图片

普通的斐波那契数列时间复杂度:O()

优缺点

优点:代码简单

缺点占用空间较大、如果递归太深,可能会发生栈溢出、可能会有重复计算,通过备忘录或递归的方式。

优化手段:动态规划(请看动态规划篇)

复应用场景

递归作为基础算法,应用非常广泛,比如在

  • 二分查找、快速排序、归并排序、树的遍历上都有使用递归

  • 回溯算法、分治算法、动态规划中也大量使用递归算法实现

  后记 

      本文从递归介绍以及案例分析给大家分享,如果感觉有所收获,可以动动小手指给点个赞,微信扫描关注本人微信公共账号,更多好文分享,感谢阅读!

end

图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值