java之学习记录 11 - 1 - 数据结构与算法基础(递归)

递归

概念
递归,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。也就是说,递归算法是一种直接或者间接调用自身函数或者方法的算法。
 
本质
递归,去的过程叫 " " ,回来的过程叫
 
递是调用,归是结束后回来
 
是一种循环,而且在循环中执行的就是调用自己
 
递归调用将每次返回的结果存在栈帧中
 
递归三要素
 
  • 递归结束条件
    • 既然是循环就必须要有结束,不结束就会OOM
  • 函数的功能
    • 这个函数要干什么,打印,计算....
  • 函数的等价关系式
    • 递归公式,一般是每次执行之间,或者与个数之间的逻辑关系
小例子: 打印 5 ”Hello World“
//循环实现
public static void print(String ss) {
    for(int i=1;i<=5;i++){
        System.out.println(ss);
    }
}
//递归实现
public static void print(String ss, int n) {
    //递归条件
    if(n>0){
        //函数的功能
        System.out.println(ss);
        //函数的等价关系式
        print(ss,n-1);
    }
}

public static void main(String[] args) {
    //调用循环
    print("Hello World");
    System.out.println("======================");
    //调用递归
    print("Hello World", 5);
}
递归要素:
 
递归结束条件: n<=0
 
函数的功能: System.out.println(ss);
 
函数的等价关系式: fun(n)=fun(n-1)
 

经典案例

斐波那契数列: 0 1 1 2 3 5 8 13 21 34 55.....
 
规律:从第 3 个数开始,每个数等于前面两个数的和
 
递归分析:
 
函数的功能:返回 n 的前两个数的和
 
递归结束条件:从第三个数开始, n<=2
 
函数的等价关系式: fun(n)=fun(n-1)+fun(n-2)
//递归实现
public static int fun2(int n) {
    if (n <= 1) return n;
    return fun2(n - 1) + fun2(n - 2);
}
public static void main(String[] args) {
    fun1(9);
    System.out.println("==================================");
    System.out.println(fun2(9));
}

时间复杂度

斐波那契数列 普通递归解法为O(2^n)

优缺点
  • 优点:代码简单
  • 缺点:占用空间较大、如果递归太深,可能会发生栈溢出、可能会有重复计算 通过备忘录或递归的方式去优化(动态规划)
应用
  • 递归作为基础算法,应用非常广泛,比如在二分查找、快速排序、归并排序、树的遍历上都有使用递归
  • 回溯算法、分治算法、动态规划中也大量使用递归算法实现
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值