java人物跳舞的算法_数据结构与算法系列八(递归见面礼)

本文探讨了学习数据结构与算法的重要性,包括面试优势、避免CRUDBoy和成为优秀工程师的途径。介绍了如何系统学习,从基础到实践,重点关注常用数据结构(数组、链表、栈、队列等)和算法(递归、排序、哈希等)。通过实例演示递归在推荐系统和电影院座位问题中的应用。
摘要由CSDN通过智能技术生成

1.引子

1.1.为什么要学习数据结构与算法?

有人说,数据结构与算法,计算机网络,与操作系统都一样,脱离日常开发,除了面试这辈子可能都用不到呀!

有人说,我是做业务开发的,只要熟练API,熟练框架,熟练各种中间件,写的代码不也能“飞”起来吗?

于是问题来了:为什么还要学习数据结构与算法呢?

#理由一:

面试的时候,千万不要被数据结构与算法拖了后腿

#理由二:

你真的愿意做一辈子CRUD Boy吗

#理由三:

不想写出开源框架,中间件的工程师,不是好厨子

1.2.如何系统化学习数据结构与算法?

我想好了,还是需要学习数据结构与算法。但是我有两个困惑:

1.如何着手学习呢?

2.有哪些内容要学习呢?

学习方法推荐:

#学习方法

1.从基础开始,系统化学习

2.多动手,每一种数据结构与算法,都自己用代码实现出来

3.思路更重要:理解实现思想,不要背代码

4.与日常开发结合,对应应用场景

学习内容推荐:

数据结构与算法内容比较多,我们本着实用原则,学习经典的、常用的数据结构、与常用算法

#学习内容:

1.数据结构的定义

2.算法的定义

3.复杂度分析

4.常用数据结构

数组、链表、栈、队列

散列表、二叉树、堆

跳表、图

5.常用算法

递归、排序、二分查找

搜索、哈希、贪心、分治

动态规划、字符串匹配

2.考考你

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

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

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

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

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

3.谁是最终推荐人?

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

#递归稍微有些复杂,我们通过两篇来学习:

1.第一篇是见面礼:

1.1.体会两个生活中的小案例

2.第二篇是重头戏:

2.1.详细分析递归的实现

2.2.递归实现的注意事项

3.案例

3.1.求最终推荐人

简述:

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

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

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

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

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

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

7fe5445ba9d9d2c33722a2173ea1c352.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);

}

3.2.电影院看电影

简述:

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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值