《数据结构与算法之美》读书笔记4(递归)

递归是一种应用非常广泛的算法。之后要讲的很多数据结构和算法的编码实现都要用到递归:DFS深度优先搜索,前中后序二叉树遍历等。

推荐注册返佣金这个功能,用户A推荐用户B来注册,用户B推荐用户C来注册。可以说用户B的“最终推荐人”为用户A,而用户B的“最终推荐人”为A,用户A没有“最终推荐人”。所以给定一个用户ID,然后查询这个用户的“最终推荐人”?这时就要用到递归。

去电影院看电影,不知道坐在第几排,太黑了没法数,这是你可以问前面一排的人他是第几排,你想在他的数字上+1,就知道自己是第几排了,但是前面的人也看不清,所以他也问他前面的人,就这样一排一排的问。知道你签名的人告诉你他是第几排,你就知道答案了。

这是一个非常标准的递归求解问题的分析过程,去的过程叫“递”,回来的过程叫“归”。基本上,所有的递归问题都可以用递推公式来表示。

f(n)=f(n-1)+1

其中f(1)=1

f(n)想知道自己是哪一排,那f(n)表示前面一排所在的排数,f(1)=1表示第一排的人知道自己在第一排。有了这个递推公式,就可以写成递归代码:

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

递归需要满足的三个条件

如果满足这三个条件,就可以用递归来解决:

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

子问题就是规模更小的问题,比如:你要知道“自己在哪一排”的问题,可以分解为“前面一排的人在哪一排”这样的子问题。

这个问题与分解之后的子问题,处理数据规模不同,求解思路完全一样

比如你求解“自己在哪一排”的思路,和前面一排的人求解“自己在哪一排”的思路,是一模一样的。

存在递归的终止条件

把问题分解为子问题,把子问题再分解为子问题,一层一层分解下去,不能存在无限循环,这就需要有终止条件。比如电影院第一排的人不需要再询问任何人,就知道自己是在哪一排,也就是f(1)=1,这就是递归的终止条件。

递归代码要警惕重复计算

假如这里有n个台阶,每次你可以跨1个台阶或者2个台阶,请问走这n个台阶有多少种走法?如果有7个台阶,你可以2,2,2,1这样子上去,也可以1,2,1,1,2这样子上去,总之走法有很多,那如何用编程求得总共有多少种走法呢?

可以根据第一步的走法把所有走法分为两类,第一类是第一步走了1个台阶,另一类是第一步走了2个台阶。所以n个台阶的走法就等于先走1阶后,n-1个台阶的走法 加上先走2阶后,n-2个台阶的走法。用公式表示就是:

f(n)=f(n-1)+f(n-2)

然后确定终止条件,f(1)=1和f(2)=2。转换为递归代码:

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

直接这样写会出现重复计算的问题,把递归过程分解一下是这样的:

有些被重复计算了很多次,为了避免重复计算,可以通过数组来保存已经求解过的f(k),当递归调用到f(k)时,先看下是否已经求解过了,如果是,直接从数组中取值,不需要重复计算。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

乐鑫科技收购创新硬件公司 M5Stack 控股权

乐鑫科技 (688018.SH) 宣布收购 M5Stack(明栈信息科技)的控股权。这一战略举措对于物联网和嵌入式系统领域的两家公司来说都是一个重要的里程碑,也契合了乐鑫和 M5Stack 共同推动 AIoT 技术民主化的愿景。 M5Stack 以其创新的硬件开发方式而闻…

DSP技术及应用——学习笔记一(量化效应)

文章图片内容主要来着老师的PPT,内容为自己总结梳理的学习笔记 二进制定点表示与量化误差 二进制定点表示 基础知识 二进制小数的定点表示 正数小数的定点表示: 思考题:推算字长为16的二进制最大正数与二进制正数 补码:正数不变&…

微电子封装分类及引线键合

1微电子封装分类 - 按功能 模拟电路、存储器传感器、功率电路、光电器件、逻辑电路、射频电路、MEMS、LED等等 - 按结构 分立器件/单芯片封装、多芯片封装、三维封装、真空封装、非真空封装、CSP,BGA/FBGA等等 - 按工艺 线焊封装(WB)、倒装焊封装(FC)、晶圆级封装(WLP)等等 -…

华中农业大学第十三届程序设计竞赛 个人题解(待补)

前言: 注意本篇博客的题解目前并不完整,未来会慢慢补齐的。 进入实验室后接触算法比赛的机会更多了,我接触的题也不再是简单的c语言题了,开始遇到更多我没接触过的算法和难题了,死磕这些难题对现在的我不但花时间而且成…

kubebuilder(4)部署测试

将crd部署到k8s make install 日志: kustomize build config/crd | kubectl apply -f - customresourcedefinition.apiextensions.k8s.io/demoes.tutorial.demo.com created 查看下[rootpaas-m-k8s-master-1 demo-operator]# kubectl api-resources | grep demo de…

python爬虫学习-------scrapy的第一部分(二十九天)

🎈🎈作者主页: 喔的嘛呀🎈🎈 🎈🎈所属专栏:python爬虫学习🎈🎈 ✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天…

【stomp实战】搭建一套websocket推送平台

前面几个小节我们已经学习了stomp协议,了解了stomp客户端的用法,并且搭建了一个小的后台demo,前端页面通过html页面与后端服务建立WebSocket连接。发送消息给后端服务。后端服务将消息内容原样送回。通过这个demo我们学习了前端stomp客户端的…

BBEdit for Mac v15.0.3激活版 支持多种类型的代码编辑器

BBEdit包含了很多一流的功能,包括GREP图样匹配,搜索和替换多个文件(即使未开启的远程服务器上的文件),项目定义的工具,功能导航和众多的源代码语言的语法着色,代码折叠,FTP和SFTP打开…

视频质量度量VQM算法详细介绍

视频质量评价 视频质量评价(Video Quality Assessment,VQA)是指通过主观、客观的方式对视频图像的内容、画质等,进行感知、衡量与评价。 ITU definations subjective assessment: the determination of the quality or impairment of programme-like pictures presented…

后端程序员利用 AI 给网站制作专业 favicon

看看你的 Chrome 浏览器顶部的标签页,每个标签页前面有一个小小的图标,这个就是 favicon,如果你将网页保存到收藏夹,前面也会是这个小图标。这个图标有时候就是网站的 Logo,有时候也不太一样。 上面截图中&#xff0c…

C++学习随笔(10)——string

本章我们来了解一下string类。 目录 1. string类是什么? 1.1 C语言中的字符串 1.2 string类本质 2. 标准库中的string类 2.1 string类 2.2 string类的常用接口说明 1. string类对象的常见构造 2. string类对象的容量操作 3. string类对象的访问及遍历操作…

static和extern关键字详解

目录 创作不易,如对您有帮助,还望一键三连,谢谢!!! 回顾 1.作用域和声明周期 1.1作用域 1.2生命周期 2.static和extern 2.1extern 2.2static 2.2-1static修饰局部变量 2.2-2static修饰全局变量 创…

vue flvjs 播放视频

写在前面: 之前使用过vodiejs插件播放过mp4视频格式的视频; 此次需要使用flvjs插件播放rtsp视频格式的视频; 因为视频的数据格式不同,所以对应的插件不同。 思维导图: 参考链接:rtmp、rtsp、flv、m3u8、 …

手把手教会你做属于自己的网站《保姆级教程》

手把手教会你做属于自己的网站《保姆级教程》 前言开始教程特别说明下期内容预报 前言 什么是个人网站? 个人网站是指因特网上一块固定的面向全世界发布消息的地方,通常由域名(也就是网站地址)、程序和网站空间构成,并…

麒麟 Kylin V10 一键安装 Oracle 11GR2 单机 ASM(231017)

前言 Oracle 一键安装脚本,演示麒麟 Kylin V10 一键安装 Oracle 11GR2 单机 ASM(231017)过程(全程无需人工干预):(脚本包括 ORALCE PSU/OJVM 等补丁自动安装) ⭐️ 脚本下载地址&a…

(八)小案例银行家应用程序-排序-数组排序

排序一直有很多的算法,今天我们仅仅来说JavaScript内置的排序方法 ● 字符串 const owners [Jonas, Zach, Adam, Martha]; console.log(owners.sort()); console.log(owners);但是注意,这个方法会改变原有的数组; ● 我们在试试数字 cons…

用java实现PDF的下载

1.下载PDF模版 2.导入依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>7.2.5</version><type>pom</type></dependency> 3.完整代码 package com.by.controller…

JAVASE8中基本数据类型

本篇文章基于有过一部分的C语言基础的&#xff0c;还望大家理解 在进入到学习之前我们必须要清楚的是在JAVASE中数据类型与C语言中的数据类型基本上是相同的,接下来我们先来对8中数据类型进行简要介绍&#xff0c;他们分别是&#xff1a; 如果大家之前了解过C语言那么对于基本数…

常见的工业路由器访问问题

A&#xff1a;工业路由器已经设置了pptp怎么访问路由下面的电脑 1. 确认PPTP VPN设置&#xff1a;首先&#xff0c;确保PPTP VPN服务器在工业路由器上已正确设置&#xff0c;并且处于活动状态。这包括确保VPN服务器的IP地址、端口、用户名和密码等设置正确无误。 2. 连接到VP…

Apple公司面试题之Apple-Orange

1. 引言 你幻想过在Apple公司工作吗&#xff1f; 如果心动过&#xff0c;那这个逻辑推理面试题就是给你准备的&#xff01;这是一道有趣的面试题&#xff0c;如下所示&#xff1a; 看到这里的同学&#xff0c;我建议你暂停文章&#xff0c;拿起笔和纸&#xff0c;试一试。准…