当前位置: 首页 > news >正文

递归算法讲解(c基础)

  1. 递归的定义
    • 递归是指在函数的定义中使用函数自身的方法。它是一种解决问题的策略,将一个大型复杂的问题逐步分解为规模更小的、与原问题相似的子问题来解决。当子问题的规模足够小,达到一个可以直接求解的基本情况(也称为终止条件)时,递归过程就停止。
  2. 递归的组成部分
    • 递归调用:函数在其内部调用自身的操作。例如,计算阶乘的函数factorial(n)中,return n * factorial(n - 1)这一行就是递归调用。它表示为了计算n的阶乘,需要先计算n - 1的阶乘,以此类推。
    • 终止条件:这是递归的关键部分,用于停止递归调用,避免无限循环。以阶乘函数为例,当n == 0n == 1时,factorial(n)直接返回1,这就是终止条件。因为0的阶乘和1的阶乘定义为1,此时不需要再进行递归调用。
  3. 递归的执行过程(以阶乘函数为例)
    • 假设我们要计算5的阶乘,即factorial(5)
    • 首先,进入factorial函数,因为n = 5不满足终止条件(n!=0n!=1),所以执行return n * factorial(n - 1),此时需要计算factorial(4)
    • 对于factorial(4),同样不满足终止条件,继续执行return n * factorial(n - 1),需要计算factorial(3)
    • 这个过程一直持续,直到计算factorial(1)。当n = 1时,满足终止条件,factorial(1)直接返回1
    • 然后,递归调用开始返回。factorial(2)得到2*1 = 2(因为factorial(2)执行2*factorial(1)),factorial(3)得到3*2 = 6(因为factorial(3)执行3*factorial(2)),以此类推,最终factorial(5)得到5*4*3*2*1 = 120
  4. 递归的优点
    • 代码简洁:对于一些具有重复结构的问题,如树的遍历、斐波那契数列的计算等,递归可以使代码非常简洁。例如,计算斐波那契数列的函数:

展开过程

这段代码通过递归很直观地表达了斐波那契数列的定义:第n项等于第n - 1项和第n - 2项之和。

  • 易于理解(对于某些问题):当问题本身具有递归性质时,递归算法可以自然地反映问题的结构。例如,在树结构中,递归遍历(如先序遍历、中序遍历、后序遍历)就很好地利用了树的递归定义:树是由根节点、左子树和右子树组成的,左子树和右子树本身也是树。

  1. 递归的缺点
    • 效率问题:递归函数可能会导致大量的函数调用开销。以斐波那契数列的递归计算为例,在计算fibonacci(n)时,会重复计算很多子问题。例如,计算fibonacci(5)时,fibonacci(3)会被计算两次,随着n的增大,重复计算的次数会呈指数增长,导致时间复杂度较高(斐波那契数列的递归计算时间复杂度为)。
    • 可能导致栈溢出:由于递归是通过函数调用栈来实现的,每次递归调用都会在栈中占用一定的空间。如果递归深度太深(例如,一个无限递归或者递归深度超过了栈的容量),就会导致栈溢出错误。例如,在一个栈空间有限的环境中,计算一个非常大的阶乘或者深度很深的树的遍历可能会出现这种情况。
  2. 递归的应用场景
    • 树和图的遍历:如二叉树的先序、中序、后序遍历,图的深度优先搜索(DFS)等。以二叉树的先序遍历为例,先访问根节点,然后递归地访问左子树和右子树,代码如下:

展开过程

  • 数学计算:如阶乘、斐波那契数列等计算。
  • 分治算法:将一个大问题分解为多个小的子问题,分别解决子问题后再合并结果。例如,快速排序算法中的划分操作部分递归地对左右子数组进行排序,这也是一种分治思想的体现。

相关文章:

递归算法讲解(c基础)

递归的定义 递归是指在函数的定义中使用函数自身的方法。它是一种解决问题的策略,将一个大型复杂的问题逐步分解为规模更小的、与原问题相似的子问题来解决。当子问题的规模足够小,达到一个可以直接求解的基本情况(也称为终止条件&#xff09…...

AJAX一、axios使用,url组成(协议,域名,资源路径)查询参数和化简,错误处理,请求/响应报文,状态码,接口文档,

一、AJAX是什么 概念 &#xff1a; AJAX是一种与服务器&#xff08;后端&#xff09;通信的技术 二、请求库axios的基本用法 1导包 2使用 // 1. 发请求 axios({ url: 请求地址 }).then(res > { // 2.接收并使用数据 }) <body><p class"province"…...

QT6学习第六天 初识QML

QT6学习第六天 创建Qt Quick UI项目使用Qt Quick DesignerQML 语法基础导入语句 import对象 object 和属性 property布局注释表达式和属性绑定QML 编码约定 设置应用程序图标 创建Qt Quick UI项目 如果你有只测试QML相关内容快速显示界面的需求&#xff0c;这时可以创建Qt Qui…...

映射vim键位,基本功能键位表(未更完)

键位映射&#xff1a;建议使用jj代替esc,毕竟esc离手那么远 linux下修改方法是&#xff1a;vim /etc/vim/vimrc 在该文件尾添加inoremap jj <Esc>该方法可以同样可以用到其他键位映射上 i&#xff1a;表示这个映射是在插入模式&#xff08;insert mode&#xff09;下有效…...

Python学习笔记(5)Python的创建型设计模式

创建型设计模式&#xff08;Creational Design Patterns&#xff09;&#xff0c;主要关注对象的创建机制。这类模式可以使得系统更加独立于如何创建、组合和表示其对象。通过将这些职责分离出来&#xff0c;创建型设计模式有助于提高代码的灵活性和复用性。 本书的范例代码已经…...

qt QAnimationDriver详解

1、概述 QAnimationDriver是Qt框架中提供的一个类&#xff0c;它主要用于自定义动画帧的时间控制和更新。通过继承和实现QAnimationDriver&#xff0c;开发者可以精确控制动画的时间步长和更新逻辑&#xff0c;从而实现丰富和灵活的动画效果。QAnimationDriver与QAbstractAnim…...

零拷贝相关知识点(一)

前言 大家好&#xff0c;我是程序员田螺。 零拷贝是老生常谈的问题啦&#xff0c;大厂非常喜欢问。比如Kafka为什么快&#xff0c;RocketMQ为什么快等&#xff0c;都涉及到零拷贝知识点。最近技术讨论群几个伙伴分享了阿里、虾皮的面试真题&#xff0c;也都涉及到零拷贝。因此…...

STM32的CAN波特率计算

公式&#xff1a; CAN波特率 APB总线频率 / &#xff08;BRP分频器 1&#xff09;/ (SWJ BS1 BS2) SWJ一般为1。 例如STM32F407的&#xff0c;CAN1和CAN2都在在APB1下&#xff0c;频率是42000000 如果想配置成1M波特率&#xff0c;则计算公式为&#xff1a;...

简单好用的折线图绘制!

折线图的概念及作用&#xff1a; 折线图&#xff08;Line Chart&#xff09;是一种常见的图表类型&#xff0c;用于展示数据的变化趋势或时间序列数据。它通过一系列的数据点&#xff08;通常表示为坐标系中的点&#xff09;与这些点之间的线段相连&#xff0c;直观地展示变量…...

Hadoop批量计算实验

参考: Hadoop(一)之实验一CentOS7配置Hadoop系统:配置CentOS和下载安装包_基于虚拟机cents7搭建hadoop实验目的-CSDN博客 --------------------------------------------------------- 一、安装Vmware 二、创建虚拟机 1.安装centos7 ①打开VMware,点击新建虚拟机。 …...

基于rpcapd与wireshark的远程实时抓包的方法

基于rpcapd与wireshark的远程实时抓包的方法 服务端安装wireshark侧设置 嵌入式设备或服务器上没有图形界面&#xff0c;通常使用tcpdump抓包保存为pcap文件后&#xff0c;导出到本地使用wireshark打开分析&#xff0c;rpcapd可与wireshark配合提供一种远程实时抓包的方案&…...

ubuntu多版本安装gcc

1.ubuntu安装gcc 9.3.1 $ sudo apt update $ sudo apt install gcc-9 g-9 二、配置GCC版本 安装完成后&#xff0c;需要使用update-alternatives命令来配置GCC版本。这个命令允许系统在多个安装的版本之间进行选择 1.添加GCC 9.3.1到update-alternatives管理 $ sudo update-a…...

算法刷题Day1

BM47 寻找第k大 第一天就随便记录吧&#xff0c;万事开头难&#xff0c;我好不容易开的头&#xff0c;就别难为自己&#xff0c;去追求高质量了。嘿嘿嘿 题目 传送门 解题思路一&#xff1a;维护一个大小为k的最小堆。最后返回堆顶元素。 代码&#xff1a; # # 代码中的类名…...

泛化调用 :在没有接口的情况下进行RPC调用

什么是泛化调用&#xff1f; 在RPC调用的过程中&#xff0c;调用端向服务端发起请求&#xff0c;首先要通过动态代理&#xff0c;动态代理可以屏蔽RPC处理流程&#xff0c;使得发起远程调用就像调用本地一样。 RPC调用本质&#xff1a;调用端向服务端发送一条请求消息&#x…...

Java 泛型详细解析

泛型的定义 泛型类的定义 下面定义了一个泛型类 Pair&#xff0c;它有一个泛型参数 T。 public class Pair<T> {private T start;private T end; }实际使用的时候就可以给这个 T 指定任何实际的类型&#xff0c;比如下面所示&#xff0c;就指定了实际类型为 LocalDate…...

题解:CF332B Maximum Absurdity

CF332B CF332B 暴力思路 题目要我们找两个不重叠的区间&#xff0c;并使区间的值最大。那我们可以考虑使用双重循环搭配前缀和暴力求最大值。代码如下。 for(int i1;i<n;i) {ll lsum[ik-1]-sum[i-1],maxx;for(int jik;j<n;j){maxxlsum[jk-1]-sum[j-1];if(maxx>ans.…...

Vue 集成和使用 SQLite 的完整指东

1. 引言 SQLite 是一种轻量级的关系型数据库管理系统&#xff0c;以其简单易用、无需服务器等特点广泛应用于嵌入式系统、移动应用和小型应用程序中。在 Web 开发中&#xff0c;尤其是前端应用开发中&#xff0c;SQLite 可以作为客户端本地存储的一种选择&#xff0c;为用户提…...

【JVM什么时候触发YoungGC和FullGC】

YoungGC 年轻代Eden区满&#xff0c;就会触发YoungGC FullGC 老年代空间不足 经过多次GC后的大年龄对象会被放进老年代&#xff0c;或创建的大对象会直接在老年代分配&#xff0c;此时若老年代空间不足&#xff0c;就会触发FullGC。空间分配担保失败 触发YoungGC的时候会进行…...

ubuntu配置网络

1&#xff0c;设置桥接模式 1-1&#xff1a; 确定。 1-2&#xff1a; 编辑--->虚拟网络编辑器 刚安装ubuntu的时候&#xff0c;可能没有任何VMnet. 更改设置的目的&#xff1a; 添加VMnet0&#xff0c;并且设置VMnet为桥接模式--自动桥接。 如果没有VMnet0,选择添加网络…...

第十一课 Unity编辑器创建的资源优化_预制体和材质篇(Prefabs和Materials)详解

预制体(Prefabs) Unity中的预制体是用来存储游戏对象、子对象及其所需组件的可重用资源&#xff0c;一般来说预制体资源可充当资源模版&#xff0c;在此模版基础上可以在场景中创建新的预制体实例。 使用预制体的好处 由于预制体系统可以自动保持所有实例副本同步&#xff0c…...

基于SEID模型与ode45数值解的艾滋病传播动力学建模与区域防控策略评估

1. 当数学模型遇上艾滋病防控 我第一次接触传染病建模是在研究生时期&#xff0c;当时导师扔给我一叠艾滋病流行病学数据&#xff0c;说&#xff1a;"试试用微分方程描述这个传播过程"。那会儿对着密密麻麻的病例报告&#xff0c;我完全没想到数学公式真能模拟现实中…...

基于GAN的端到端ISP:用AI学习从RAW到RGB的图像处理革命

1. 项目概述&#xff1a;从“拍”到“算”的ISP革命在计算机视觉和图像处理领域&#xff0c;图像信号处理器&#xff08;ISP&#xff09;一直扮演着“幕后英雄”的角色。它负责将相机传感器捕捉到的原始、未经处理的RAW Bayer数据&#xff0c;转换为我们手机相册里那些色彩鲜艳…...

计算机视觉模型选型实战:四维战场决策法

1. 项目概述&#xff1a;这不是一场技术选型&#xff0c;而是一次实战能力的现场测验 “计算机视觉的战场&#xff1a;选择你的冠军”——这个标题乍看像游戏海报&#xff0c;实则精准戳中了当前CV工程落地最真实的痛点。它不谈论文指标、不堆模型参数&#xff0c;而是把镜头直…...

【限时公开】谷歌内部未文档化Gemini JavaScript SDK隐藏能力:流式响应中断控制、上下文压缩率提升63%实测数据

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Gemini JavaScript SDK核心能力概览 Gemini JavaScript SDK 是 Google 官方提供的轻量级客户端库&#xff0c;专为在浏览器和 Node.js 环境中无缝集成 Gemini 模型能力而设计。它抽象了底层 HTTP 请求、…...

为Odoo ERP构建安全的AI数据访问层:基于权限治理的语义查询实践

1. 项目概述&#xff1a;为Odoo ERP构建一个受治理的AI数据访问层如果你正在使用Odoo管理企业业务&#xff0c;同时又希望让AI助手&#xff08;比如Claude、Cursor&#xff09;能够安全地查询销售数据、分析库存状况&#xff0c;而不是让它们直接面对你的生产数据库写SQL&#…...

终极指南:如何使用Cherry MX键帽3D模型库打造你的专属机械键盘

终极指南&#xff1a;如何使用Cherry MX键帽3D模型库打造你的专属机械键盘 【免费下载链接】cherry-mx-keycaps 3D models of Chery MX keycaps 项目地址: https://gitcode.com/gh_mirrors/ch/cherry-mx-keycaps 想要打造一把真正属于自己的机械键盘吗&#xff1f;厌倦了…...

2026年6分钟腾讯云部署OpenClaw/Hermes Agent及使用喂饭级步骤流程

2026年6分钟腾讯云部署OpenClaw/Hermes Agent及使用喂饭级步骤流程。OpenClaw是开源的个人AI助手&#xff0c;Hermes Agent则是一个能自我进化的AI智能体框架。阿里云提供计算巢、轻量服务器及无影云电脑三种部署OpenClaw 与 Hermes Agent的方案、百炼Token Plan兼容主流 AI 工…...

【信息科学与工程学】【通信工程】第五十九篇 面向SDN城域网网络的算法工程02

条目:SDN-Metro-0065 (IPoE入L3VPN业务) 字段 内容 1. 编号​ SDN-Metro-0065 2. 类别​ 业务领域 / 接入与VPN 3. 领域​ 基于动态策略的IPoE用户接入L3VPN业务 4. 模型配方​ IPoE(IP over Ethernet)用户通过以太网接入,并直接进入运营商的L3VPN网络,访问企业内…...

公交查询|智能公交|公交线路查询|基于SprinBoot+vue智能公交系统(源码+数据库+文档)

公交查询|智能公交|公交线路查询系统 目录 基于SprinBootvue智能公交系统 一、前言 二、系统设计 三、系统功能设计 1用户模块实现 2管理员服务端模块实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介…...

抖音无水印视频下载终极指南:免费批量保存高清内容

抖音无水印视频下载终极指南&#xff1a;免费批量保存高清内容 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support.…...