数据结构与算法系列八(初识递归)

121 阅读3分钟

到目前为止,基于线性表的数据结构我们都看完了,简单回顾一下,它们是:数组、链表、栈、队列。这些数据结构是其它数据结构与算法的基础,需要重点关注。

这一篇开始,我们开启算法的列车了,请系好安全带!第一个要看的算法是:递归。递归这两个字你一定很熟悉,有没有?

如果没有的话,我们先举一个例子。从2016年开始到如今,知识付费发展的如火如荼。如果你也是其中的一员,比如说在xx平台购买了xx课程。大多数平台都会告诉你,将你购买的课程分享出去,假如有人通过你分享的链接购买了该课程,那么平台会给你佣金返现。

既然与钱有关系,那就比较麻烦了!对于平台来说,有这么几个问题需要搞清楚。比如说: 1.谁是一级推荐人?

2.谁是二级推荐人......?

3.谁是最终推荐人?

因为不同级的推荐人,返现佣金的比例可不一样,千万别返错了,对吧。关于这种类似求推荐人的问题,有请我们今天的主角登场,它就是:递归

#递归稍微有些复杂,我们通过两篇来学习:
1.第一篇是见面礼:
  1.1.体会两个生活中的小案例
  
2.第二篇是重头戏:
  2.1.详细分析递归的实现
  2.2.递归实现的注意事项

案例

求最终推荐人

简述:

1.A在某某知识付费平台购买了课程:xx。并将链接分享到了微信朋友圈

2.B通过A分享的链接,购买了课程:xx。并且将链接分享到了微信朋友圈

3.C通过B分享的链接,购买了课程:xx。并且将连接分享到了微信朋友圈

4.以此类推下去......

5.假如以C为起点,如何求出课程:xx的最终推荐人?

6.假设数据库中存储的数据是这样的:

image.png

求解:

1.你肯定想到了,这个问题好简单,经常写如下类似这样的代码:

/**
* 求最终推荐人
*/
public String findRootRecommend(String userId,String xx){
    // 根据购买课程用户id、课程  查询数据库,获取推荐用户id
    String 【分享用户id】 = select 【分享用户id】 from 【购买课程表】 where 【用户id】 = 【userId】 and 【课程id】 = 【xx】;
    
    // 判断是否是根据好友分享购买的课程
    if(分享用户id == null){
        return userId;
    }
    
    // 递归查找
    return findRootRecommend(分享用户id,xx);
}

电影院看电影

简述:

1.你与女朋友正在电影院看电影,电影已经放映

2.突然,女朋友问你:我们坐在电影院的第几排?

3.你一看,坏了:电影院一片漆黑,伸手不见五指

4.这个问题必须要回答,因为是女朋友问的,你该怎么办?

求解:

1.别忘了,你是程序员,对于程序员来说,这个问题太简单了

2.用递归:先问前一排的人,他们在第几排?

3.前一排的人,再问他的前一排,在第几排?

4.以此类推......

5.一直问到第一排的人,第一排不需要再问了,直接回答在第一排

6.第二排的人:在第一排的人基础上 + 1

7.以此类推......

8.每一排都在前一排的基础上 + 1,最后到了你们这一排,女朋友得到了满意的答案

9.你很骄傲有没有?用代码回答,类似这样:

public int movies(int n){
    // 如果是第一排,返回1
    if(n == 1){ return 1;}
    
    // 递归向前一排询问
    return movies(n - 1) + 1;
}