10 _ 递归:如何用三行代码找到“最终推荐人”?

news2025/7/20 2:09:12

推荐注册返佣金的这个功能我想你应该不陌生吧?现在很多App都有这个功能。这个功能中,用户A推荐用户B来注册,用户B又推荐了用户C来注册。我们可以说,用户C的“最终推荐人”为用户A,用户B的“最终推荐人”也为用户A,而用户A没有“最终推荐人”。

一般来说,我们会通过数据库来记录这种推荐关系。在数据库表中,我们可以记录两行数据,其中actor_id表示用户id,referrer_id表示推荐人id。

基于这个背景,我的问题是,给定一个用户ID,如何查找这个用户的“最终推荐人”? 带着这个问题,我们来学习今天的内容,递归(Recursion)!

如何理解“递归”?

从我自己学习数据结构和算法的经历来看,我个人觉得,有两个最难理解的知识点,一个是动态规划,另一个就是递归

递归是一种应用非常广泛的算法(或者编程技巧)。之后我们要讲的很多数据结构和算法的编码实现都要用到递归,比如DFS深度优先搜索、前中后序二叉树遍历等等。所以,搞懂递归非常重要,否则,后面复杂一些的数据结构和算法学起来就会比较吃力。

不过,别看我说了这么多,递归本身可是一点儿都不“高冷”,咱们生活中就有很多用到递归的例子。

周末你带着女朋友去电影院看电影,女朋友问你,咱们现在坐在第几排啊?电影院里面太黑了,看不清,没法数,现在你怎么办?

别忘了你是程序员,这个可难不倒你,递归就开始排上用场了。于是你就问前面一排的人他是第几排,你想只要在他的数字上加一,就知道自己在哪一排了。但是,前面的人也看不清啊,所以他也问他前面的人。就这样一排一排往前问,直到问到第一排的人,说我在第一排,然后再这样一排一排再把数字传回来。直到你前面的人告诉你他在哪一排,于是你就知道答案了。

这就是一个非常标准的递归求解问题的分解过程,去的过程叫“递”,回来的过程叫“归”。基本上,所有的递归问题都可以用递推公式来表示。刚刚这个生活中的例子,我们用递推公式将它表示出来就是这样的:

f(n)=f(n-1)+1 其中,f(1)=1

f(n)表示你想知道自己在哪一排,f(n-1)表示前面一排所在的排数,f(1)=1表示第一排的人知道自己在第一排。有了这个递推公式,我们就可以很轻松地将它改为递归代码,如下:

int f(int n) {
  if (n == 1) return 1;
  return f(n-1) + 1;
}

递归需要满足的三个条件

刚刚这个例子是非常典型的递归,那究竟什么样的问题可以用递归来解决呢?我总结了三个条件,只要同时满足以下三个条件,就可以用递归来解决。

1.一个问题的解可以分解为几个子问题的解

何为子问题?子问题就是数据规模

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1157433.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GSA、GSEA、ssGSEA、GSVA的算法原理及它们的联系与区别

一、 简述 为了从基因的表达水平中得到更加具体直观的生物学功能变化的信息,多种基于已知的基因集的分析方法应运而生。其中,基因集分析(Gene Set Analysis)、基因集富集分析(Gene Set Enrichment Analysis&#xff09…

上网行为审计软件丨上网行为审计解决方案

很多人一听到上网行为审计就会心有余悸,认为是公司侵犯员工隐私的一种不良的方式,但是对于上网行为审计软件,我们要辩证的看待。 上网行为审计确实有一定的好处: 1、监控网络行为,防止不当行为: 上网行为…

jdk官网下载(详细步骤)

jdk全部版本下载网址 Java Archive | Oraclehttps://www.oracle.com/java/technologies/downloads/archive/ 下载之前先建立oracle账号(免费创建),不用特意去搜,你点击下载jdk的时候会自动弹出来,自己建立一个账号就能下载了 找到自己要下载…

【论文笔记】Unifying Large Language Models and Knowledge Graphs:A Roadmap

(后续更新完善) 2. KG-ENHANCED LLMS 2.1 KG-enhanced LLM Pre-training 以往将KGs集成到大型语言模型的工作主要分为三个部分:1)将KGs集成到训练目标中,2)将KGs集成到LLM输入中,3)将KGs集成到附加的融合模块中。 2.1.1 Integr…

Sci Immunol丨先天性 IL-25-ILC2-MDSC 轴

今天和大家分享一篇发表于2022年6月的文章,题目为“An innate IL-25-ILC2-MDSC axis creates a cancer-permissive microenvironment for Apc mutation-driven intestinal tumorigenesis”,发表在《Sci Immunol》杂志上。文章主要研究了Interleukin-25 (…

数据智能化管理:企业网站备案信息API的应用案例

引言 在数字化时代,企业备案信息管理变得愈发重要。无论是为了合规性还是提高业务运营效率,企业都需要有效管理其网站备案信息。幸运的是,现代技术为企业提供了强大的工具,如企业网站备案信息API,可帮助他们更智能地管…

第一个QT程序

新建工程&#xff1a; 1. 点击“New Project” 2. 选择“Qt Widgets Application” 3. 工程名和路径 4. 构建系统选择 5. Details 一些细节 6. 选择Kits 7. 完成工程创建 点完成按钮 8. 运行下看 9. 一些示例代码 //main.cpp #include "mywidget.h"#include <Q…

关于宝塔面板提示“upgrade your ACME client to support TLSv1.2 or better”的解决办法

今天续期SSL证书的时候提示“upgrade your ACME client to support TLSv1.2 or better”&#xff0c;这一般是旧系统情况下TLS版本过低&#xff1a;acme.sh版本低于2.8所引起的&#xff0c;也就是提示&#xff1a;升级你的系统至 TLS 1.2 协议或更高版本。 但是国内服务器无法…

Java模块化应用实践之精简JRE | 京东云技术团队

导语 Java9及以后的版本引入了模块化特性&#xff0c;但是直到今天JDK21都发布了&#xff0c;依然没有被大量使用起来&#xff0c;那么这个特性就真的没啥意义了吗&#xff1f; 别忘了&#xff0c;Java本身可是把模块化做到了极致的&#xff0c;所以可以利用这个特性对JRE本身…

Vue解决img路径报错

问题&#xff1a; 我们有一组图片的地址&#xff0c;使用v-for遍历img标签&#xff0c;设置src属性&#xff0c;却无法获取图片 解决方法&#xff1a; 因为我们将图片路径放入data中后会被webpack进行打包&#xff0c;这时候的路径仅仅只是一个字符串&#xff0c;无法进行解析…

diffusers-Tasks

https://huggingface.co/docs/diffusers/using-diffusers/unconditional_image_generationhttps://huggingface.co/docs/diffusers/using-diffusers/unconditional_image_generation1.Unconditional image generation 无条件图像生成是一个相对简单的任务。模型仅生成图像&…

QT5交叉编译保姆级教程(arm64、mips64)

什么是交叉编译&#xff1f; 简单说&#xff0c;就是在当前系统平台上&#xff0c;开发编译运行于其它平台的程序。 比如本文硬件环境是x86平台&#xff0c;但是编译出来的程序是在arm64架构、mips64等架构上运行 本文使用的操作系统&#xff1a;统信UOS家庭版22.0 一、安装…

生产环境超时问题最佳实践-从timeout导致500错误获得

最近发现线上系统的一个功能出现500错误。该功能是调用外部服务&#xff08;内含把一个文件传给另一个平台&#xff09;&#xff0c;用同样文件&#xff0c;测试环境下测试可以&#xff0c;线上环境不行。先记录解决思路如下&#xff1a; 1、比较环境&#xff1a;测试环境和线上…

计算机视觉的监督学习与无监督学习

什么是监督学习&#xff1f; 监督学习是一种机器学习算法&#xff0c;它从一组已标记的 合成数据生成器中生成的训练数据中学习。这意味着数据科学家已经用正确的标签&#xff08;例如&#xff0c;“猫”或“狗”&#xff09;标记了训练集中的每个数据点&#xff0c;以便算法可…

NFC芯片MS520:非接触式读卡器 IC

MS520 是一款应用于 13.56MHz 非接触式通信中的高集成 度读写卡芯片。它集成了 13.56MHz 下所有类型的被动非接触 式通信方式和协议&#xff0c;支持 ISO14443A 的多层应用。 主要特点 ◼ 高度集成的解调和解码模拟电路 ◼ 采用少量外部器件&#xff0c;即可将输…

Python 算法高级篇:最小生成树算法的优化与应用

Python 算法高级篇&#xff1a;最小生成树算法的优化与应用 引言 1. 最小生成树问题简介2. Prim 算法3. Kruskal 算法4. 优化与比较5. 案例应用&#xff1a;通信网络设计6. 总结 引言 最小生成树&#xff08; Minimum Spanning Tree &#xff0c; MST &#xff09;是图论中的一…

thymeleaf无法加载resources中的静态资源

springbootthymeleaf整合无法加载resources中的静态资源异常处理 打包编译项目&#xff0c;显示找不到js、css等静态资源 重新编译项目加载资源&#xff0c;还是找不到 修改pom.xml资源配置文件 如果设置编码还是打包失败&#xff0c;或者显示找不到js、css、html等静态资源…

Linux 下C++工程编译

创建文件夹 #include<iostream> using namespace std;int main(){cout<<"THis is C program Process!"<<endl;}编译执行命令&#xff1a; g test.cpp -o test实际上&#xff0c;上述的命令包含了如下的四个过程&#xff1a; 1. 预处理 g -E …

【Redis】Redis常用命令-getsetkeysexistsexpirettltype

文章目录 读取文档注意事项set命令get命令全局/通用命令KEYSEXISTSDELEXPIRETTLTYPE 读取文档注意事项 官方文档链接&#xff1a;https://redis.io/ 注意&#xff1a;redis的命令不区分大小写 在redis文档给出的语法格式说明&#xff1a; []&#xff1a;相当于一个独立的单元&a…

(免费领源码)Java#ssm#MySQL高校知识共享系统设计与实现35050-计算机毕业设计项目选题推荐

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对高校知识共享系统等问题&#xff0c;对高校…