【语法篇】14、浅谈递归函数

避开这些坑!晶圆封装中Wire Bonding(引线键合)的5种常见不良与实战调试心得 本文深入探讨晶圆封装中Wire Bonding(引线键合)的5种常见不良现象,包括Wire Offset、BSOB不良、球径/球厚异常、弧度不良和IMC问题。通过实际案例和参数优化方案,帮助工程师提升封装质量和可靠性,特别适用于半导体封装领域的专业人士。 阅读详情

来源:https://www.jianshu.com/p/c9a145ca1bc3

一、什么是递归

其实上节课讲到函数的最后,我们打了一个比方:把主程序中的顺序比喻成正常的时间顺序,遇到函数调用,即相当于做梦,可以跳出当前时空,做完梦之后又会回到做梦的时空处。有一些“梦”会比较有意思,在梦里继续做了同样的梦,这就叫做递归。
我们用最最浅显易懂的一个故事来说明:

老和尚讲故事

 

从前有座山,山里有座庙,庙里有个老和尚,在给小和尚讲故事。讲的什么故事呢?从前有座山,山里有座庙,庙里有个老和尚,在给小和尚讲故事。讲什么故事呢?从前有座山,山里有座庙,庙里有个老和尚,在给小和尚讲故事。讲的什么故事呢?从前有座山,山里有座庙,庙里有个老和尚,在给小和尚讲故事。。。。。。

说白了,就是自己调用自己,函数调用函数,再举一个比较饶舌的例子,关于递归的定义。

递归:
参见递归。
很迷糊,对吧,好吧,再具体一些。
递归:
如果还是没有明白递归是什么意思,参见“递归”。

其实说白了,就是“自己用自己”。在数学函数中,递归往往会很简单,有助于理解,譬如我们熟悉的阶乘运算,f(n)=n!,一般在数学上就定义成:
{
f(0)=1
f(n)=f(n-1) * n (n>=1)
}
如果我们用代码来实现一下,那是再简单不过的事情了。

 

#include <iostream>
using namespace std;

long long f(int x){
    if(x==0)
          return 1;
    return f(x-1) * x;
}

int main(){
  int n;
  cin>>n; // 此处n的规模应该很小,再大的话,需要考虑高精度算法
  cout<<(long long) f(n);  //暂时不考虑太大的数据
  return 0;
}

其实基本上就是照抄数学表达式,因此递归函数的关键在于理清思路,明确数学表达式,稍微要注意的一个问题时,递归一定要写清楚“终止条件”,像上面的例子,终止条件是x==0,如果没有终止条件,函数将无限递归......
如果对上面阶乘递归还不过清楚的话,可以参看下面的一个比喻:

皇帝(main函数):大臣,你给我算一下f(3)。
大臣(调用f(3)的那个函数):知府,你给我算一下f(2)。
知府(调用f(2)的那个函数):县令,你给我算一下f(1)。
县令(调用f(1)的那个函数):师爷,你给我算一下f(0)。
师爷(调用f(0)的那个函数):回老爷,f(0)=1。
县令:回知府大人,f(1)=1。
知府:回大人,f(2)=2。
大臣:回皇上 ,f(3)= 6。
最终得到了结果,皇上满意了。

最后要注意的是,递归对我们理清思路和理解代码非常简单,但是反复的调用,对计算机的运算是一个噩梦,而且在递归运算中,往往会反复递归,反复运算,拜拜耗费大量的时间,另外从时间花销上,递归函数无疑是一个不太好的函数,对于运算次数较多(递归深度较深)时,我们往往不用递归,因为一般都会超时。


二、练习

1、斐波那契数。
2、输入一个非负整数,输出它的逆序数。如123,输出321。

使用Docker搭建SearXNG搜索引擎 【代码】使用Docker搭建SearXNG搜索引擎。 阅读详情

相关推荐

ABAP BAPI_PRODORD_CHANGE函数详解:如何高效重读生产订单主数据

本文深入解析ABAP BAPI_PRODORD_CHANGE函数在生产订单主数据高效处理中的应用。通过详细讲解函数架构、主数据重读机制及实战代码示例,帮助开发人员掌握生产订单数据的精准读取与更新技术,提升SAP系统集成与自动化处理效率。

weixin_29207149的博客 470

基础学习日志 ━━ 理解递归(使用go语法举例)

用实例剖析递归地执行过程,理解了这个,就一通百通了~~

暂时先用这个名字 542

从零到一:使用阿里云百炼搭建企业级 AI Agent 完全实战手册(2026超详细版)

本文是一份企业级AI Agent构建手册,主要面向企业技术负责人、AI产品经理和后端开发工程师。手册详细介绍了如何在阿里云百炼平台上搭建企业智能体应用的全流程,包括环境准备、知识库构建、智能体创建、工具集成、工作流编排等核心环节。重点内容包括: 准备工作:阿里云账号注册、百炼服务开通、免费额度领取、API Key管理 知识库构建:文档格式要求、内容优化原则、RAG系统搭建 智能体开发:Agent创建、工具集成、复杂业务工作流设计 生产部署:多渠道接入、监控运维、安全治理 成本控制:Token预算管理、选型决

u010323587的专栏 1100

关于“递归”的语法和例子

递归语法: 1.递归是很耗费内存的,递归算法可以不用的时候尽量别用 2.以下程序运行的时候发生了这样一个错误{不是异常,是错误Error} java.lang.StackOverflowError 栈内存溢出错误 错误无法挽回,只有一个结果,就是JVM停止工作 3.递归必须有结束条件,没有结束条件一定会发生栈内存溢出错误 例子:使用递归计算1-N的求和 public class RecursionTest2 { public static void main(String[]

weixin_44546294的博客 824

ChatIE:基于ChatGPT的零样本信息抽取实战指南

信息抽取是自然语言处理中的核心任务,旨在从非结构化文本中自动识别并结构化关键信息,如实体、关系及事件。传统方法依赖大量标注数据训练专用模型,流程复杂且成本高昂。随着大语言模型的发展,通过提示工程引导模型理解任务,实现了无需训练数据的零样本抽取能力,极大降低了技术门槛与应用成本。这种范式将信息抽取重构为多轮对话问题,通过分阶段提问引导模型逐步输出结构化结果,在快速原型验证、领域适配及小规模数据探索中展现出显著技术价值。本文以ChatIE项目为例,深入解析如何利用ChatGPT API,通过精心设计的提示词与两

weixin_30540691的博客 404

YDOOK: ANSYS Maxwell 19 教程7:Maxwell 2D 材料管理 添加新增 永磁材料

使用ANSYS Maxwell 19 添加新增 永磁材料 1. 点击 Add material 按钮后,在左下方的下拉框中下拉选择永磁材料,弹出用材料设置框: 2. 按照下面数据输入 3. 输入 Hc 与 Br/Ap 两项后,其他项的数据将自动计算给出 4. 点击OK后再,为了使得材料属性的完整性,在 Bulk Conductivity 属性行中输入 材料电导率的数值。 ...

YDOOK 1万+

java基础语法——递归

递归 ​ 递归是一种编程技巧,程序自己调用自己 ​ 递归的优势:能够更快地写出代码 复杂度很低 ​ 递归的劣势:特别消耗内存 ​ 凡是可以使用递归的程序都可以使用循环 ​ 但是能够使用循环的程序不一定可以使用递归 ​ 能够做到栈帧复用的递归程序就称之为尾递归 ​ 使用递归时一定要小心栈内存溢出 public class Test { public static void main(String[...

hjf1998的博客 312

大众奥迪诊断不求人:手把手解析SAE J2819(CAN TP2.0)协议报文与连接流程

本文深入解析大众奥迪车型诊断核心标准SAE J2819(CAN TP2.0)协议,详细拆解连接建立流程与报文控制字段。通过实战案例展示通道设置、参数协商等关键步骤,提供诊断设备配置建议和常见故障排查技巧,帮助工程师掌握汽车诊断通信协议的精髓。

weixin_30421809的博客 398

递归算法基本概念详解(C++基础语法)

递归算法基本概念详解一.恶魔小黑的故事二.递归函数详解1.什么是递归2.递归示例1.递归计算求和2.递归计算阶乘3.递归的改写3.1计算求和改写为for循环3.2计算递归改写为for循环 一.恶魔小黑的故事 话说在这世界上有一个恶魔,他叫小黑,小黑正在跑100米长跑。小黑有一个特殊的超能力,就是能够在自己累的不能再动的时候,能够选择自己吃掉自己身体的一部分,进而获取古娜拉黑暗之神的赐予的洪荒之力,使他离100米的终点更近一步(当然,吃掉自己的一部分以后,他就变了他完整身体的一部分),同时他的意识会记录下来自

是一只土拨鼠呐的博客 1683

PX4实战(四):PX4 uorb模块详解

本节主要讲解PX4中的uorb消息,主要包括uorb的基本概念使用、PX4内重要的uorb消息、如何自定义uorb消息以及使用uorb消息的注意点等,其中讲解重要uorb消息是为了对PX4内重要数据结构有初步的了解,有助于后期算法理解。uORB(micro Object Request Broker)是PX4中用于模块间通信的轻量级发布-订阅(Publish/Subscribe)机制。模块之间可以通过uORB传递消息,无需直接调用对方函数;提高系统模块化与解耦性;

PX4-SLAM-PNC 1932

SwinTransformer 改进:SSPCAB模块(2024最新改进方法)

SSPCAB(Spatial Pyramid Pooling with Channel Attention Block)是2024年提出的一种新型神经网络架构改进方法,专注于在保持高精度的同时显著降低计算复杂度和参数量。该方法通过创新的空间金字塔池化与通道注意力机制的结合,实现了网络结构的紧凑化和运算效率的大幅提升。核心创新点1. 混合空间金字塔池化(Hybrid Spatial Pyramid Pooling, HSPP)多尺度动态核池化:根据输入特征图尺寸动态调整池化核大小和步长交叉级联结构。

Henry的博客 1311

浅谈递归函数—C语言

浅谈递归函数—C语言 目录:浅谈递归函数—C语言递归函数的概念例题:总结 递归函数的概念 递归函数的定义:函数在其函数体内直接或间接调用它本身,则称该函数为递归函数。 递归的两个必要条件:(1)存在限制条件,当满足这个限制条件的时候,递归便不再继续;(2)每次递归调用之后越来越接近这个限制条件。 递归的主要思想:通过少量程序来描述解决问题过程所需的多次重复计算,即所谓的大事化小。 拓展:每一次调用递归函数时,计算机都会为该函数重新分配新的内存空间,并且将原递归函数暂停(可以理解为开副本),然后现场保存一下

weixin_46021963的博客 800

手把手教你学Simulink——基于Simulink的无位置传感器PMSM滑模观测器(SMO)控制

本文基于Simulink平台实现无位置传感器PMSM滑模观测器(SMO)控制,解决了传统机械位置传感器存在的成本高、体积大、抗干扰差等问题。SMO通过滑模切换函数估算反电动势,进而获得转子位置和速度,具有强鲁棒性(参数变化20%误差仅0.4°)和良好低速性能(50rpm转矩衰减<5%)。文章详细介绍了PMSM数学模型、SMO算法设计、Simulink建模步骤及参数优化方法,提供了可直接工程应用的MATLAB代码和仿真模型,为电动汽车驱动、工业机器人等高精度控制场景提供了有效解决方案。

MHD0815的博客 229

表达式语法分析——递归子程序法

#include #include #include #include //exit(0)函数头文件 using namespace std; char str[100]; int num = 0; int cur = 0; void E(); void F(); void G(); void T(); void S(); void S(){ if(str[cur] == '*'){

Grit_ICPC的博客 2301

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

递归

递归是一种编程模式,用于一个任务可以被分割为多个相似的更简单的任务的场景。或者用于一个任务可以被简化为一个容易的行为上更简单的任务变体。或者像我们随后会看到的,用来处理特定类型的数据结构。 当一个函数解决一个任务时,在该过程中它可以调用很多其他函数。那么当 一个函数调用自身时 ,就称其为递归 递归的俩种思考方式: 简单起见,我们写一个函数pow(x, n),它可以计算x的n次方,即用x乘以自身n次...

吴小迪的博客 3万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

递归算法

一、基本概念             递归算法是一种直接或者间接调用自身函数或者方法的算法。Java递归算法是基于Java语言实现的递归算法。递归算法的实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法来表示问题的解。递归算法对解决一大类问题很有效,它可以使算法简洁和易于理解。递归算法,其实说白了,就是程序的自身调用。它表现在一段程序中往往会遇到调用自身的那样一种coding策略,这

极致的专注 无限的热情 3万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

2.3.5 递归规则与文法的递归性

2.3.5 递归规则与文法的递归性 1. 递归规则 所谓递归规则,是指在规则的左部和右部具有相同非终结符的规则。 如果文法中有规则 A → A … 称为规则左递归。 如果文法中有规则 A → … A 称为规则右递归。 如果文法中有规则 A → … A … 称为规则递归。 2. 文法的递归性 文法的递归性是指对文法中任一非终结符,若能建立一个推导过程,在推导所得的符号串****中又出现了该非终结符本身,则文法是递归性的,否则是无递归性的。 若文法中有推导 A ⇒+ A … 称文法左递归。 若文法中有推导 A

qq_45180475的博客 4721

递归的定义以及示意讲解

递归说明:   递归一定要控制递归的层数,当符合某一条件是要终止递归,几乎所有的递归都能用循环来代替 递归的优缺点:   优点:     递归可以把问题简单化,让路径更为清晰,代码更为简洁   缺点:     递归因系统环境的影响大,当递归深度太大时,可能会得到不可预知的结果 示例: 以下示意一个无限递归的例子: def fun(): print("我要吃好吃的") fu...

Shen1105的博客 4944

函数的基本语法,递归

函数是什么? 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,具体区别,我们后面会讲,编程中的函数在英文中也有很多不同的叫法。在BASIC中叫做subroutine(子过程或子程序),在Pascal中叫做procedure(过程)和function,在C中只有function,在Java里面叫做method。 定义: 函数是指将一组语句的集合通过一个名字(函数名)封装...

weixin_34194702的博客 342

算法设计方法:递归的内涵与经典应用

大师说:To Iterate is Human, to Recurse, Divine.毋庸置疑地,递归确实是一个奇妙的思维方式。对一些简单的递归问题,我们总是惊叹于递归描述问题和编写代码的简洁,但要想真正领悟递归的精髓、灵活地运用递归思想来解决问题却并不是一件容易的事情。本文剖析了递归的思想内涵并分析了阶乘、斐波那契数列、汉诺塔、杨辉三角的存取、字符串回文判断、字符串全排列、二分查找、树的深度求解等八个问题。

Rico's Blogs 3万+

递归(一)递归的基本用法

本文为学习数据结构与算法Python版的个人笔记 递归的 进制转换 将整数转换为任意进制 def toStr(number,base): str_dict='0123456789ABCDEF' if number<base: return str_dict[number] x1=number//base x2=number%base return toStr(x1,base)+str_dict[x2] 才开始写的时候,明白用取整来减少规模.

fff2zrx的博客 1042

递归(一)几个简单的递归例子

刚接触递归的同学,可能难以理解递归,难以理解的点可能很多,例如: 1.函数为什么可以在自己的内部又调用自己呢? 2.既然可以自己调用自己,那么递归运行过程中一定回有很多层相互嵌套,到底什么时候不再嵌套呢? 3.递归运行过程中,相互嵌套的多层之间会有参数传递,多层之间是否会相互影响? 递归两个要素 1.递归边界 2.递归的逻辑——递归"公式" 递归的过程一定有参数的变化...

weixin_30389003的博客 5130

编译原理_递归下降语法分析(源程序)

编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。 利用C语言编制递归下降分析程序,并对简单语言进行语法分析。

Leslie的博客 10万+

Java语法-递归

1、什么是直接递归?什么是间接递归? 直接递归是A方法调用A方法; 间接递归是A方法调用B方法,B方法又回头调用A方法; 2、使用递归必须明确的前提是什么? (1)递归的结束条件; (2)递归的目的; 3、在1~n 累加和的题目中,递归的目的是获取下一个被加的数字(n-1),如何理解? public static int sum(int n){ if(n==1)return 1; else { return n + sum(n-1);

sdusgq的博客 536

左递归文法

一个文法G,若存在P经过一次或多次推导得到Pa(即能推导出以P开头的式子), 则称G是左递归的。  左递归分为直接左递归和间接左递归。   直接左递归经过一次推导就可以看出文法存在左递归,如P→Pa|b。   间接左递归侧需多次推导才可以看出文法存在左递归,如文法:S→Qc|c,Q→Rb|b,R→Sa|a有S =>Qc =>Rbc =>Sabc消除直接左递归的方法:  1、把所有产生式写成候选式

Chaoer 5470
上一篇: P进制转10进制
下一篇: Ruby 浅谈尾递归
Estrellas_
博客等级 码龄9年 273粉丝 233原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值