C 语言函数递归探秘:从基础概念到复杂问题求解的进阶之路
我的个人主页
我的专栏:C语言,希望能帮助到大家!!!点赞❤ 收藏❤
目录
- 什么是函数递归
- 递归的基本组成
- 递归的工作原理
- 递归的优缺点
- 递归的经典案例
- 5.1 阶乘计算
- 5.2 斐波那契数列
- 5.3 汉诺塔问题
- 5.4 二分查找
- 递归的高级应用
- 如何避免常见递归陷阱
- 递归与迭代的比较
- 优化递归:尾递归与动态规划
1. 什么是函数递归
递归(Recursion)是指在函数内部调用自身的一种编程技术。在C语言中,递归被广泛应用于解决一些可以分解为相似子问题的任务。在 C语言中,递归是指一个函数在其函数体内部直接或间接地调用自身的编程技巧。简单来说,就是函数自己调用自己来解决问题。
递归的关键点在于:
- 一个函数直接或间接调用自身。
- 递归必须包含一个基准条件(结束条件),否则会进入无限递归。
递归可以理解为一种分而治之的思想:将复杂问题拆分为若干规模更小但相似的子问题,直到可以直接解决。
2. 递归的基本组成
递归函数通常由以下两个部分组成:
- 基准条件(Base Case):递归的出口,满足此条件时函数不再调用自身。
- 递归关系(Recursive Case):将问题规模缩小并递归调用自身。
示例代码:简单递归函数
#include <stdio.h>void printNumbers(int n) {if (n == 0) {return; // 基准条件}printf("%d\n", n);printNumbers(n - 1); // 递归关系
}int main() {printNumbers(5);return 0;
}
输出:
5
4
3
2
1
3. 递归的工作原理
递归函数的执行本质上依赖于函数调用栈(Call Stack)。在每次递归调用时,当前函数的状态被保存到栈中,以便返回后继续执行。
关键步骤:
- 进入递归:函数调用自己,将当前状态压入栈。
- 满足基准条件:递归停止,栈开始回退。
- 退出递归:函数逐层弹栈,恢复之前的状态并继续执行。
内存模型分析
递归的每次调用会占用一定的内存空间(栈帧)。如果递归深度过大,可能导致栈溢出(Stack Overflow)。
以阶乘函数为例,当计算factorial(3)时,首先会进入函数,因为3不等于 0,所以执行return 3 * factorial(2)。此时,系统会为factorial(2)开辟一个新的栈帧,记录相关信息。接着在factorial(2)中,因为2不等于 0,执行return 2 * factorial(1),又会开辟一个新的栈帧。在factorial(1)中,执行return1 * factorial(0),再开辟一个栈帧。当factorial(0)被调用时,满足递归基例,返回 1。
然后,factorial(1)可以根据return 1 * factorial(0)计算出结果为 1,factorial(2)根据return2*factorial(1)计算出结果为 2,factorial(3)根据return 3 * factorial(2)计算出结果为6。这个过程就是从递归基例开始逐步回溯计算出最终结果的过程。
4. 递归的优缺点
优点:
- 简洁直观:递归代码通常更短、更易于理解。
- 解决复杂问题:擅长处理分治问题,例如树遍历、图搜索等。
- 自然模拟问题:递归非常适合解决数学归纳法定义的问题。
(对于一些具有递归性质的问题,如树结构的遍历、数学上的分形问题等,递归代码往往更简洁、直观。它能够清晰地反映问题的递归本质,使得程序的逻辑结构与问题的逻辑结构紧密匹配。递归可以将复杂的问题逐步分解为简单的子问题,有助于降低问题的解决难度。例如,汉诺塔问题是一个经典的递归问题,通过递归可以将移动多个圆盘的复杂问题分解为移动较少圆盘的子问题。)
缺点:
1.递归函数在每次调用自身时都会消耗一定的栈空间来存储栈帧。如果递归的深度过大(即函数自己调用自己的次数过多),可能会导致栈溢出。例如,在计算一个非常大的整数的阶乘时,如果使用简单的递归函数,可能会因为栈空间不足而导致程序崩溃。
2.递归函数的执行效率有时可能不如非递归函数。因为递归涉及到函数调用的开销,包括参数传递、栈帧的开辟和销毁等操作。在一些性能要求较高的场景下,可能需要考虑将递归函数转换为非递归函数来提高效率。
5. 递归的经典案例
5.1 阶乘计算
问题描述:计算正整数的阶乘,即 n! = n × (n-1) × ... × 1
。
#include <stdio.h>int factorial(int n) {if (n == 0 || n == 1) {return 1; // 基准条件}return n * factorial(n - 1); // 递归关系
}int main() {printf("Factorial of 5: %d\n", factorial(5));return 0;
}
输出:
Factorial of 5: 120
5.2 斐波那契数列
问题描述:计算斐波那契数列的第 n
项。
#include <stdio.h>int fibonacci(int n) {if (n == 0) return 0; // 基准条件if (n == 1) return 1; // 基准条件return fibonacci(n - 1) + fibonacci(n - 2); // 递归关系
}int main() {printf("Fibonacci(10): %d\n", fibonacci(10));return 0;
}
输出:
Fibonacci(10): 55
5.3 汉诺塔问题
问题描述:将盘子从起始柱移动到目标柱,满足每次只能移动一个盘子,且大盘子不能放在小盘子上。
#include <stdio.h>void hanoi(int n, char from, char to, char aux) {if (n == 1) {printf("Move disk 1 from %c to %c\n", from, to);return;}hanoi(n - 1, from, aux, to); // 移动 n-1 个盘子到辅助柱printf("Move disk %d from %c to %c\n", n, from, to);hanoi(n - 1, aux, to, from); // 移动 n-1 个盘子到目标柱
}int main() {hanoi(3, 'A', 'C', 'B');return 0;
}
输出:
Move disk 1 from A to C
Move disk 2 from A to B
Move disk 1 from C to B
Move disk 3 from A to C
Move disk 1 from B to A
Move disk 2 from B to C
Move disk 1 from A to C
6. 递归的高级应用
递归不仅用于简单的数学问题,还广泛应用于数据结构和算法中。例如:
- 二叉树遍历(前序、中序、后序遍历)
- 分治法(如快速排序、归并排序)
- 图的深度优先搜索(DFS)
7. 如何避免常见递归陷阱
- 缺少基准条件:确保递归总能终止。
- 过深的递归:避免递归深度过大,可以考虑尾递归优化或改用迭代。
- 错误的递归关系:递归关系必须正确传递问题规模。
8. 递归与迭代的比较
特性 | 递归 | 迭代 |
---|---|---|
代码简洁性 | 通常更短 | 可能更复杂 |
性能 | 开销较大,可能栈溢出 | 通常更高效 |
使用场景 | 适合分治和树结构问题 | 适合简单循环问题 |
9. 优化递归:尾递归与动态规划
一、尾递归优化
-
尾递归的概念
- 尾递归是一种特殊的递归形式,在尾递归函数中,递归调用是函数体中最后执行的语句,并且在递归调用返回结果后没有其他额外的操作(除了可能的返回值传递)。例如,计算斐波那契数列的尾递归版本可以这样写:
int fibonacci_tail(int n, int a, int b) {if (n == 0) {return a;} else {return fibonacci_tail(n - 1, b, a + b);} } int fibonacci(int n) {return fibonacci_tail(n, 0, 1); }
- 在这个尾递归的
fibonacci_tail
函数中,递归调用fibonacci_tail(n - 1, b, a + b)
是函数体中最后执行的操作,它直接返回递归调用的结果,没有其他后续计算。
-
尾递归的优化原理
- 对于普通递归,每次递归调用都会在栈上创建一个新的栈帧来保存函数的局部变量、参数和返回地址等信息。随着递归深度的增加,栈的使用量会不断增大,可能导致栈溢出。
- 而尾递归优化是基于一些编译器或解释器的特性,在尾递归情况下,由于递归调用是最后一步操作,编译器可以复用当前栈帧来进行下一次递归调用,而不是创建新的栈帧。这样就大大减少了栈的使用量,理论上可以支持非常大的递归深度而不会栈溢出。不过,需要注意的是,并非所有的编译器都支持尾递归优化,例如在一些常见的C语言编译器中,默认可能不进行尾递归优化,需要手动开启特定的编译选项或者采用一些特殊的编程技巧来模拟尾递归优化效果。
-
与普通递归的对比
- 以计算斐波那契数列为例,普通递归版本如下:
int fibonacci_normal(int n) {if (n == 0 || n == 1) {return n;} else {return fibonacci_normal(n - 1) + fibonacci_normal(n - 2);} }
- 普通递归版本在计算过程中会产生大量的重复计算。例如计算
fibonacci_normal(5)
时,fibonacci_normal(3)
会被多次计算。而尾递归版本通过参数传递避免了这种重复计算,并且在栈空间使用上更高效。
二、动态规划优化
-
动态规划的概念
- 动态规划是一种通过将一个复杂问题分解为一系列相互关联的子问题,并存储子问题的解来避免重复计算的优化策略。对于斐波那契数列问题,动态规划的思路是从底部开始构建解,先计算出较小的斐波那契数,然后利用这些结果逐步计算出更大的斐波那契数。例如:
int fibonacci_dp(int n) {if (n == 0 || n == 1) {return n;}int dp[n + 1];dp[0] = 0;dp[1] = 1;for (int i = 2; i <= n; i++) {dp[i] = dp[i - 1] + dp[i - 2];}return dp[n]; }
- 这里创建了一个数组
dp
来存储斐波那契数列的前n + 1
个值,通过循环逐步计算出每个值,避免了递归中的重复计算。
-
动态规划的优化原理
- 动态规划利用了问题的重叠子问题性质和最优子结构性质。对于斐波那契数列,
fibonacci(n)
的计算依赖于fibonacci(n - 1)
和fibonacci(n - 2)
,这就是重叠子问题。而最优子结构是指问题的最优解可以从其子问题的最优解构建而来。通过存储子问题的解,动态规划避免了重复计算子问题,从而提高了效率。 - 动态规划可以采用自顶向下(记忆化搜索)和自底向上(如上述斐波那契数列的示例)两种方式实现。自顶向下的记忆化搜索是在递归过程中,将已经计算过的子问题结果存储起来,下次遇到相同子问题时直接使用存储的结果,而不是再次递归计算。
- 动态规划利用了问题的重叠子问题性质和最优子结构性质。对于斐波那契数列,
-
与递归的对比
- 递归在处理一些问题时代码可能更简洁直观,但容易出现重复计算和栈溢出问题。动态规划虽然在代码实现上可能相对复杂一些,尤其是对于复杂的问题需要仔细设计状态转移方程和存储结构,但它能有效避免重复计算,并且在时间和空间复杂度上往往有更好的表现。例如,在计算斐波那契数列时,普通递归的时间复杂度是指数级的,而动态规划的时间复杂度可以优化到线性的
O(n)
,空间复杂度也可以通过一些技巧进一步优化到O(1)
(如只存储最近的两个斐波那契数)。
- 递归在处理一些问题时代码可能更简洁直观,但容易出现重复计算和栈溢出问题。动态规划虽然在代码实现上可能相对复杂一些,尤其是对于复杂的问题需要仔细设计状态转移方程和存储结构,但它能有效避免重复计算,并且在时间和空间复杂度上往往有更好的表现。例如,在计算斐波那契数列时,普通递归的时间复杂度是指数级的,而动态规划的时间复杂度可以优化到线性的
尾递归和动态规划都是优化递归的有效手段,在实际编程中,根据问题的特点选择合适的优化策略可以提高程序的性能和稳定性。
相关文章:
C 语言函数递归探秘:从基础概念到复杂问题求解的进阶之路
我的个人主页 我的专栏:C语言,希望能帮助到大家!!!点赞❤ 收藏❤ 目录 什么是函数递归递归的基本组成递归的工作原理递归的优缺点递归的经典案例 5.1 阶乘计算5.2 斐波那契数列5.3 汉诺塔问题5.4 二分查找 递归的高级…...
【Zookeeper】三,Zookeeper的安装与基本操作
文章目录 安装Zookeeper下载解压解压后的目录结构运行Zookeeper 基本操作 安装Zookeeper 下载 官网下载Zookeeper,会得到一个tar包,如:apache-zookeeper-3.8.4-bin.tar.gz 解压 tar -xvf apache-zookeeper-3.8.4-bin.tar.gz -C /usr/loca…...
STL算法之数值算法<stl_numeric.h>
这一节介绍的算法,统称为数值(numeric)算法。STL规定,欲使用它们,客户端必须包含头文件<numeric>.SGI将它们实现与<stl_numeric.h>文件中。 目录 运用实例 accumulate adjacent_difference inner_product partial_sum pow…...
Git 入门超简单指南
1. 什么是 Git? Git 是一个分布式版本控制系统,由 Linus Torvalds 于 2005 年创建。它的主要目的是帮助开发者有效地管理和跟踪项目的历史版本。通过使用 Git,你可以轻松地记录每一次代码的修改,回滚到以前的版本,以及…...
UE5 和 UE4 中常用的控制台命令总结
调用控制台 按下键盘上的 ~ 键可以调用控制台命令。 技巧 使用键盘的 ↑ 键可以查看之前输入过的指令。控制台指令并不需要打全名,输入空格后跟随指令的部分字符可以进行模糊搜索。按下 Ctrl Shift , 打开 GPUProfile 面板。 命令如下: 调试类 s…...
[护网杯 2018]easy_tornado
这里有一个hint点进去看看,他说md5(cookie_secretmd5(filename)),所以我们需要获得cookie_secret的value 根据题目tornado,它可能是tornado的SSTI 这里吧filehash改为NULL. 是tornado的SSTI 输入{{handler.settings}} (settings 属性是一个字典&am…...
论 ONLYOFFICE:开源办公套件的深度探索
公主请阅 引言第一部分:ONLYOFFICE 的历史背景1.1 开源软件的崛起1.2 ONLYOFFICE 的发展历程 第二部分:ONLYOFFICE 的核心功能2.1 文档处理2.2 电子表格2.3 演示文稿 第三部分:技术架构与兼容性3.1 技术架构3.2 兼容性 第四部分:部…...
华为OD机试真题---幼儿园篮球游戏
华为OD机试真题中的“幼儿园篮球游戏”是一道有趣的逻辑模拟题。以下是该题目的详细描述及解题思路: 题目描述 幼儿园里有一个放倒的圆桶,它是一个线性结构。允许在桶的右边将篮球放入,可以在桶的左边和右边将篮球取出。每个篮球有单独的编…...
C#基础控制台程序
11.有一个54的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。 12.从键盘输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。 13.输入一个数,判断它是奇数还是偶数,如果…...
CASS插入多行文字
问题描述 有时在DWG文件中需要标注多行文字,文字注记只是单行的。 解决办法 工具栏中选择文字——>写文字。快捷键是 MTEXT 可以自行换行,并设置相关格式。 当需要把多行文字转换成单行文字的时候,使用下列功能。可以将多行文字变成…...
【青牛科技】D1671 75Ω 带4级低通滤波的单通道视频放大电 路芯片介绍
概 述 : D1671是 一 块 带 4级 低 通 滤 波 的 单 通 道 视 频 放 大 电 路 , 可 在3V或5V的 低 电 压 下 工 作 。 该 电 路 用 在 有 TV影 象 输 出 功 能 的 产 品 上 面,比如 机 顶 盒 ,监 控 摄 象 头 ,DVD&#…...
基于stm32的智能教室管理系统/智能家居系统
基于stm32的智能教室管理系统/智能家居系统 持续更新,欢迎关注!!! ** 基于stm32的智能教室管理系统/智能家居系统 ** 目前,物联网已广泛应用在我们的生活中。智慧校园是将校园中的生活、学习、工作等相关的资源联系在一起,实现管理的智能化…...
3.10 内核 BUG_ON() at xfs_vm_writepage() -> page_buffers()
目录 前言 问题分析 page buffers创建 page buffers丢失 Write-Protect Dirty Page w/o Buffers 问题解决 前言 这个问题发生在3.10.0-514.el7上,并且在RHEL的知识库中快速找到了对应的案例以及解决方案,但是,理解问题如何发生和解决…...
理解Java集合的基本用法—Collection:List、Set 和 Queue,Map
本博文部分参考 博客 ,强烈推荐这篇博客,写得超级全面!!! 图片来源 Java 集合框架 主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合(单列…...
SQL for XML
关系数据模型与SQL SQL for XML 模式名功能RAW返回的行作为元素,列值作为元素的属性AUTO返回表名对应节点名称的元素,每列的属性作为元素的属性输出输出,可形成简单嵌套结构EXPLICIT通过SELECT语法定义输出XML结构PATH列名或列别名作为XPAT…...
RabbitMQ 篇-深入了解延迟消息、MQ 可靠性(生产者可靠性、MQ 可靠性、消费者可靠性)
??博客主页:【_-CSDN博客】** 感谢大家点赞??收藏评论** 文章目录 ???1.0 RabbitMQ 的可靠性 ? ? ? ? 2.0 发送者的可靠性 ? ? ? ? 2.1 生产者重试机制 ? ? ? ? 2.2 生产者确认机制 ? ? ? ? 2.2.1 开启生产者确认机制 ? ? ? ? 2.2…...
Java设计模式 —— 【创建型模式】原型模式(浅拷贝、深拷贝)详解
文章目录 前言原型模式一、浅拷贝1、案例2、引用数据类型 二、深拷贝1、重写clone()方法2、序列化 总结 前言 先看一下传统的对象克隆方式: 原型类: public class Student {private String name;public Student(String name) {this.name name;}publi…...
LightRAG - 更快更便宜的GraphRAG
检索增强生成(Retrieval-Augmented Generation, RAG)已经成为提升大型语言模型(LLMs)能力的重要方法之一,通过整合外部知识,显著改善了生成内容的质量和相关性。 RAG 的局限性 传统的 RAG 系统虽然表现优…...
基于STM32的智能风扇控制系统
基于STM32的智能风扇控制系统 持续更新,欢迎关注!!! ** 基于STM32的智能风扇控制系统 ** 近几年,我国电风扇市场发展迅速,产品产出持续扩张,国家产业政策鼓励电风扇产业向高技术产品方向发展,国内企业新增投资项目投…...
Java面试问答FAQ
目录: 1、post为什么会发送两次请求?2、单核CPU支持多线程吗?3、ConcurrentHashMap 如何保证线程的安全性? 1、post为什么会发送两次请求? A:那是因为浏览器的安全策略(同源策略)决…...
PHP中类名加双冒号的作用
在 PHP 中,类名加双冒号(::) 是一种用于访问类的静态成员和常量的语法。它也可以用来调用类的静态方法和访问 PHP 的类相关关键词(如 parent、self 和 static)。以下是详细的解释和用法。 1. 用途概述 :: 被称为作用域…...
[极客大挑战 2019]PHP
访问www.zip拿到源码. 绕过这三处. 构造exp <?php class Name{private $username admin;private $password 100;}$select new Name();$resserialize($select); echo $res ?>O:4:"Name":2:{s:14:"%00Name%00username";s:5:"admin"…...
【versal】【petalinux】添加LED驱动
versal 添加LED驱动 ` 提示:本文使用外部kernel与uboot`一、LED1.1 LED功能1.2 LED节点1.3 LED操作命令1.3.1 点LED1.3.2 关闭LED二、LED驱动2.1 驱动文件2.2 设备树兼容属性三、 LED设备树配置3.1 设备树配置信息3.2 设备树配置信息讲解四、提示4.1 正确4.2 错误4.3提示:本文…...
【前端】JavaScript中的字面量概念与应用详解
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 💯前言💯字面量1. 数字字面量2. 字符串字面量3. 布尔字面量4. 空值字面量(null)5. 对象字面量6. 数组字面量7. 正则表达式字面量8. 特殊值字面量9. 函数字…...
工作学习:切换git账号
概括 最近工作用的git账号下发下来了,需要切换一下使用的账号。因为是第一次弄,不熟悉,现在记录一下。 打开设置 路径–git—git remotes,我这里选择项是Manage Remotes,点进去就可以了。 之后会出现一个输入框&am…...
python-解决一元一次方程
【题目】解决一元一次方程数学问题 【问题描述】 我们要解决一个较为复杂的一元一次方程数学问题,方程形如:ax b c,其中a、b、c为已知常数,x为未知数。 现在我们要通过编程的方式解决这个问题,即找到方程的解x。 【…...
在线音乐播放器 —— 测试报告
自动化脚本源代码:Java: 利用Java解题与实现部分功能及小项目的代码集合 - Gitee.com 目录 前言 一、项目简介 1.项目背景 2.应用技术 (1)后端开发 (2)前端开发 (3)数据库 二、项目功能…...
6.算法移植第六篇 YOLOV5/rknn生成可执行文件部署在RK3568上
接上一篇文章best-sim.rknn模型生成好后,我们要将其转换成可执行文件运行在RK3568上,这一步需要在rknpu上进行,在强调一遍!!rknpu的作用是可以直接生成在开发板上运行的程序 退出上一步的docker环境 exit1.复制best-…...
【贪心算法第七弹——674.最长连续递增序列(easy)】
目录 1.题目解析 题目来源 测试用例 2.算法原理 3.实战代码 代码分析 1.题目解析 题目来源 674.最长递增子序列——力扣 测试用例 2.算法原理 贪心思路 3.实战代码 class Solution { public:int findLengthOfLCIS(vector<int>& nums) {int n nums.size();in…...
剖析前后端 API 接口参数设计:JSON 数据结构化全攻略
在当今软件开发领域,前后端分离架构已成为主流趋势。而 API 接口作为前后端之间数据交互的桥梁,其设计的合理性对系统的可维护性和扩展性起着至关重要的作用。JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式&…...
【RISC-V CPU debug 专栏 2.3 -- Run Control】
文章目录 Run ControlHart 运行控制状态位状态信号操作流程时间与实现注意事项Run Control 在 RISC-V 调试架构中,运行控制模块通过管理多个状态位来对硬件线程(harts)的执行进行调节和控制。这些状态位帮助调试器请求暂停或恢复 harts,并在 hart 复位时进行控制。以下是运…...
力扣887:鸡蛋掉落问题
题目描述: 给你 k 枚相同的鸡蛋,并可以使用一栋从第 1 层到第 n 层共有 n 层楼的建筑。 已知存在楼层 f ,满足 0 < f < n ,任何从 高于 f 的楼层落下的鸡蛋都会碎,从 f 楼层或比它低的楼层落下的鸡蛋都不会破。…...
Matlab与python数据处理对比
MATLAB 和 Python 都是数据分析和科学计算中常用的编程语言,各自有其优点和应用场景。它们在数据处理方面有许多相似之处,但也有一些关键差异。以下是 MATLAB 和 Python 在数据处理方面的对比与总结。 ### 1. **语法与语言特性** - **MATLAB**: - 以…...
【系统架构设计师】高分论文:论软件架构的生命周期
更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 摘要正文摘要 2022 年5月,本人所在的某集团公司承接了财务共享服务平台综合管理系统的项目开发,该项目主要实现财务系统主流业务的集成共享。本人担任项目组成员中的系统架构设计师一职,全面负责项目的全生命周…...
gitlab工作笔记
gitlab常用操作 gitlab常用笔记docker 安装模式pull imagerun一个gitlab container atttach入containerdocker run 之后要等几分钟安装之后的初始配置初始密码在哪里 :第一次登录创建和检查第一个工程能否正常clone gitlab常用笔记 装过几次gitlab,但每…...
shell完结
声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…...
优维HAO案例:全球TOP15汽车零件供应商「IT运维自动化」创新工程
撰文:鹿小U / 制图:脾气超好 又是一家很厉害的客户。 YADT是全(hu)球(zhēn)领(ji)先(sh)的汽车座椅供应商,拥有从汽车座椅零部件到整椅的完整生产制造能力,为中国几乎所有的汽车制造商提供汽车整椅产品和服务。 YADT在国内拥…...
语义版本控制
注意: 本文内容于 2024-11-27 22:25:05 创建,可能不会在此平台上进行更新。如果您希望查看最新版本或更多相关内容,请访问原文地址:语义版本控制。感谢您的关注与支持! 由于自己平时喜欢写点小玩意,自然而…...
C++设计模式行为模式———策略模式
文章目录 一、引言二、策略模式三、总结 一、引言 策略模式是一种行为设计模式, 它能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。与模板方法模式类似,都是以扩展的方式来支持未来的变化。…...
Pgsql:json字段查询与更新
1.查询json字段的值 SELECT attribute_data->>设施类别 mycol, * FROM gis_coord_data WHERE attribute_data->>设施类别阀门井 查询结果如下: 2.更新json字段中的某个属性值 UPDATE gis_coord_data SET attribute_data(attribute_data::jsonb ||{&quo…...
鸿蒙面试 --- 性能优化
性能优化可以从三个方面入手 感知流畅、渲染性能、运行性能 感知流畅 在应用开发中,动画可以为用户界面增添生动、流畅的交互效果,提升用户对应用的好感度。然而,滥用动画也会导致应用性能下降,消耗过多的系统资源,…...
【逐行注释】自适应观测协方差R的AUKF(自适应无迹卡尔曼滤波,MATLAB语言编写),附下载链接
文章目录 自适应R的UKF逐行注释的说明运行结果部分代码各模块解释 自适应R的UKF 自适应无迹卡尔曼滤波(Adaptive Unscented Kalman Filter,AUKF)是一种用于状态估计的滤波算法。它是基于无迹卡尔曼滤波(Unscented Kalman Filter&…...
mac下安装Ollama + Open WebUI + Llama3.1
本文介绍mac下安装Ollama Open WebUI Llama3.1 8b具体步骤。 目录 推荐配置Ollama Open WebUI Llama3.1简介安装Ollama安装Open WebUI 推荐配置 m1以上芯片,16g内存,20g以上硬盘空间 Ollama Open WebUI Llama3.1简介 Ollama: 下载,管理…...
Python Tornado框架教程:高性能Web框架的全面解析
Python Tornado框架教程:高性能Web框架的全面解析 引言 在现代Web开发中,选择合适的框架至关重要。Python的Tornado框架因其高性能和非阻塞I/O特性而备受青睐。它特别适合处理大量并发连接的应用,比如聊天应用、实时数据处理和WebSocket服务…...
QT-installEventFilter
installEventFilter 是 Qt 框架中的一个方法,用于在对象之间建立事件过滤机制。具体来说,它允许一个对象(称为事件过滤器)监视另一个对象(称为被监视对象)的事件,并在这些事件被处理之前对其进行…...
ZYNQ详解
ZYNQ是Xilinx公司推出的一系列SoC(System-on-Chip,系统级芯片)产品家族,它将传统的FPGA(可编程逻辑器件)与嵌入式处理器相结合,形成了一种集成了硬件和软件处理能力的单一芯片解决方案。以下是对…...
代码随想录打卡DAY21
算法记录第21天 [二叉树] 1.LeetCode 538. 把二叉搜索树转换为累加树 题目描述: 给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原…...
LeetCode【代码随想录】刷题(数组篇)
704.二分查找 力扣题目链接 题目:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 思路:简单的二…...
Python知识第十二天分享
假设有一个文件 num.txt,里面存储了如下的一些数字,内容如下: 10 18 30 11 12 15 编写一个 python 程序,读取文件中的内容,存储成 python 中的列表形式: sum 0 with open(./num.txt, r) as nu_f:list1 …...
[SWPUCTF 2021 新生赛]easy_md5
借鉴博客 [SWPUCTF 2021 新生赛]easy_md5_青少年ctf easymd5-CSDN博客 我们直接看见源码 <?php highlight_file(__FILE__);include flag2.php;if (isset($_GET[name]) && isset($_POST[password])){$name $_GET[name];$password $_POST[password];if ($name …...