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

7.6 函数的递归调用

 

直接调用:

### 1. 直接递归调用

直接递归调用是指一个函数直接调用自己。例如,计算阶乘的函数,可以使用递归方法:

int factorial(int n) {if (n <= 1) {return 1;}return n * factorial(n - 1);
}

在这个例子中,`factorial` 函数在其函数体内直接调用了自己,这就是直接递归。

间接调用:

 

2. 间接递归调用

间接递归调用是指函数A调用函数B,然后函数B再调用函数A。这也称为循环递归。

考虑以下的例子:

void funcA(int n);
void funcB(int n);void funcA(int n) {if (n <= 0) return;printf("From funcA: %d\n", n);funcB(n-1);
}void funcB(int n) {if (n <= 0) return;printf("From funcB: %d\n", n);funcA(n-2);
}

在这个例子中,`funcA` 调用 `funcB`,然后 `funcB` 又调用 `funcA`,形成了一个间接递归的调用链。

### 注意事项

- 无论是直接递归还是间接递归,都应确保有一个明确的退出条件(或称为基线条件)。否则,递归调用可能会无限制地继续,导致栈溢出。

- 递归(无论是直接还是间接)通常会增加额外的时间和空间开销,因为每次函数调用都需要在内存中分配空间来保存返回地址、局部变量等。因此,当非递归方法同样简洁且易于理解时,通常推荐使用非递归方法。

- 递归的优点在于其可读性和解决某些问题的直观性。当面对某些特定问题(如树和图的遍历)时,递归方法通常更加直观。

了解这些概念后,你可以更有效地使用递归,并了解其背后的逻辑和潜在的陷阱。

 

 

 

 

 

 

 

 总结:
 

### 重点:

1. **定义**:递归是一种编程技巧,函数在其定义中直接或间接地调用自身。

2. **基线条件**:为了避免无限递归,必须有一个或多个条件决定何时停止递归调用,这被称为基线条件或递归出口。

3. **子问题分解**:递归的核心思想是将问题分解为更小的、相似的子问题。子问题应该是原始问题的一个简化版本。

### 难点:

1. **思维模式**:递归需要一种不同的思维模式,即能够自然地将问题分解为子问题。这需要练习和经验来掌握。

2. **调试**:由于递归函数可能有多个执行实例同时存在(每次调用都会产生一个新实例),调试递归函数可能比非递归函数更复杂。

3. **效率问题**:递归函数在某些情况下可能效率较低,特别是当它重复计算相同的子问题时(例如,简单的斐波那契递归实现)。

### 易错点:

1. **缺少基线条件**:忘记为递归函数提供适当的基线条件会导致无限递归,最终可能导致栈溢出。

2. **不恰当的基线条件**:选择的基线条件不恰当或逻辑错误,可能导致函数不返回预期结果。

3. **不正确的递归逻辑**:子问题的递归调用逻辑错误会导致错误的输出或无法达到基线条件。

4. **栈溢出**:深度递归可能会导致栈空间耗尽,从而导致栈溢出错误。

5. **空间复杂度**:由于递归使用栈存储每次函数调用的信息,深层次的递归调用可能会导致大量的内存使用。

6. **重复计算**:在某些递归实现中,可能会多次计算相同的子问题,从而浪费计算资源。

了解这些重点、难点和易错点有助于更好地理解、设计和调试递归函数。递归是一个强大的工具,但使用时要小心。

相关文章:

7.6 函数的递归调用

直接调用&#xff1a; ### 1. 直接递归调用 直接递归调用是指一个函数直接调用自己。例如&#xff0c;计算阶乘的函数&#xff0c;可以使用递归方法&#xff1a; int factorial(int n) {if (n < 1) {return 1;}return n * factorial(n - 1); } 在这个例子中&#xff0c;f…...

本地开机启动jar

1&#xff1a;首先有个可运行的jar包 本地以ruiyi代码为例打包 2&#xff1a;编写bat命令---命名为.bat即可 echo off java -jar D:\everyDay\test\RuoYi\target\RuoYi.jar 3&#xff1a;设置为开机自启动启动 快捷键winr----输入shell:startup---打开启动文档夹 把bat文件复…...

解决uniapp手机真机调试时找不到手机问题

1、检查 USB 调试是否开启 2、检查是否有选择 文件 传输 选项 3、如果上述都做了还找不到&#xff0c;可以看看开发者选项中的【USB设置】&#xff0c;把模式改为 MIDI 模式...

HarmonyOS应用开发者-----高级认证试题及答案

HarmonyOS应用开发者高级认证试题及答案 试题会不定时刷新,本试题仅供大家学习参考 【判断题】 2/2 HarmonyOS应用可以兼容OpenHarmony生态 正确(True)【判断题】 2/2 所有使用@Component修饰的自定义组件都支持onPageShow,onBackPress和onPageHide生命周期函数。 正确(True…...

R语言随机波动模型SV:马尔可夫蒙特卡罗法MCMC、正则化广义矩估计和准最大似然估计上证指数收益时间序列...

全文链接&#xff1a;http://tecdat.cn/?p31162 最近我们被客户要求撰写关于SV模型的研究报告&#xff0c;包括一些图形和统计输出&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 相关视频 本文做SV模型&#xff0c;选取马尔可夫蒙特卡罗法(MCMC)、正则化广…...

详细教程:Stegsolve的下载,jdk的下载、安装以及环境的配置

最近在学习隐写术&#xff0c;下载stegsolve 以及使用stegsolve倒腾了很久&#xff0c;避免朋友们和我一样倒腾了很久&#xff0c;希望此文可以帮到刚在学习隐写的朋友们(win7下使用stegsolve) 文章目录 一、下载stegsolve链接二、jdk的下载三、jdk的安装四、配置环境变量五、检…...

Watermark 是怎么生成和传递的?

分析&回答 Watermark 介绍 Watermark 本质是时间戳&#xff0c;与业务数据一样无差别地传递下去&#xff0c;目的是衡量事件时间的进度&#xff08;通知 Flink 触发事件时间相关的操作&#xff0c;例如窗口&#xff09;。 Watermark 是一个时间戳, 它表示小于该时间戳的…...

深度学习论文分享(八)Learning Event-Driven Video Deblurring and Interpolation

深度学习论文分享&#xff08;八&#xff09;Learning Event-Driven Video Deblurring and Interpolation 前言Abstract1 Introduction2 Motivation2.1 Physical Model of Event-based Video Reconstruction2.2 Spatially Variant Triggering Threshold 3 Proposed Methods3.1 …...

UI设计开发原则

一、一致性原则 坚持以用户体验为中心设计原则&#xff0c;界面直观、简洁&#xff0c;操作方便快捷&#xff0c;用户接触软件后对界面上对应的功能一目了然、不需要太多培训就可以方便使用本应用系统。 1、字体 保持字体及颜色一致&#xff0c;避免一套主题出现多个字体&am…...

Mac 如何判断下载Mac with Intel Chip 还是 Mac with Apple Chip

如下图&#xff0c;当我们在 Mac系统 下载客户端时&#xff0c;有两种选择&#xff1a;Mac with Intel Chip 、 Mac with Apple Chip 如何判断要下载哪一种&#xff1f; 需要判断本机Mac是在Inter芯片还是Apple芯片上运行的。方法如下&#xff1a; 点击屏幕左上角Apple标志&a…...

windows笔记本远程连接如何打开任务管理器?

参考素材&#xff1a; https://jingyan.baidu.com/article/8275fc86a97f5207a03cf6cd.html https://www.anyviewer.cn/how-to/ctrl-alt-delete-remote-desktop-6540.html 网上查了很多方法&#xff0c;都说ctrlaltend可以解决这个问题。 但是笔记本键盘上没有end键。 继续查了一…...

GitHub打不开解决方法——授人以渔

打不开GitHub的原因之一&#xff0c;DNS地址解析到了无法访问的ip。&#xff08;为什么无法访问&#xff1f;&#xff09; 1、打开GitHub看是哪个域名无法访问&#xff0c;F12一下 2、DNS解析看对应的域名目前哪个IP可以访问 DNS解析的网址&#xff1a; &#xff08;1&#x…...

gRPC之数据压缩Snappy、zstd

文章目录 gRPC之数据压缩Snappy一、背景二、什么是snappy1. Snappy适合场景 三、demo: Go代码实现了一个snappy压缩格式的压缩器for grpc1. 这段代码怎么保证并发安全的&#xff1f; 四、什么是zstd五、 zstd和snappy有什么区别,如何选择?六、demo: Go代码实现了一个zstd压缩格…...

k8s之存储篇---存储类StorageClass

介绍 StorageClass 为管理员提供了描述存储"类"的方法。 不同的类型可能会映射到不同的服务质量等级或备份策略&#xff0c;或是由集群管理员制定的任意策略。 Kubernetes 本身并不清楚各种类代表的什么。这个类的概念在其他存储系统中有时被称为"配置文件&quo…...

WordPress(4)关于网站的背景图片更换

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、更改的位置1. 红色区域是要更换的随机的图片二、替换图片位置三.开启随机数量四.结束前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也…...

2 | Window 搭建单机 Hadoop 和Spark

搭建单机 Hadoop 和 Spark 环境可以学习和测试大数据处理的基础知识。在 Windows 操作系统上搭建这两个工具需要一些配置和设置,下面是一个详细的教程: 注意: 在开始之前,请确保你已经安装了 Java 开发工具包(JDK),并且已经下载了 Hadoop 和 Spark 的最新版本。你可以从…...

接口测试与功能测试的区别~

今天为大家分享的是我们在日常测试工作中, 一定会接触并且目前在企业中是主要测试内容的 功能测试与接口测试 一.功能测试与接口测试的基本概念。 1.1 什么是功能测试呢? 功能测试: 是黑盒测试的一方面, 检查实际软件的功能是否符合用户的需求 功能测试测试的内容包括以下…...

LeetCode 23 合并 K 个升序链表

LeetCode 23 合并 K 个升序链表 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/merge-k-sorted-lists/description/ 博主Github&#xff1a;https://github.com/GDUT-Rp/LeetCode 题目&#xff1a; 给你一个链表数组…...

[国产MCU]-W801开发实例-TCP客户端

TCP客户端 文章目录 TCP客户端1、TCP协议简单介绍2、W801创建TCP客户流程本文将详细介绍如何在W801中使用TCP客户端。 1、TCP协议简单介绍 传输控制协议 (TCP) 是一种标准,它定义了如何建立和维护应用程序可以用来交换数据的网络对话。 TCP 与 Internet 协议 (IP) 一起工作,…...

《爵士乐史》乔德.泰亚 笔记

第一章 【美国音乐的非洲化】 【乡村布鲁斯和经典布鲁斯】 布鲁斯&#xff1a;不止包括忧愁、哀痛 十二小节布鲁斯特征&#xff1a; 1.乐型&#xff08;A:主、B:属、C/D:下属&#xff09;&#xff1a;A→A→B→A→C→D→A→A 2.旋律&#xff1a;大三、小三、降七、降五 盲人…...

别再问客服了!手把手教你用VNC在AutoDL GPU服务器上跑起你的第一个GUI程序

云端GPU服务器VNC实战&#xff1a;从零部署GUI开发环境全指南 租用云GPU服务器进行深度学习训练已成为算法工程师的常态&#xff0c;但当代码涉及图形界面时&#xff0c;许多开发者会在cv2.imshow()或PyQt窗口弹出的环节卡壳。本文将基于AutoDL平台&#xff0c;详解如何通过Tur…...

3分钟掌握京东自动抢购神器:告别“手慢无“的终极指南

3分钟掌握京东自动抢购神器&#xff1a;告别"手慢无"的终极指南 【免费下载链接】autobuy-jd 使用python语言的京东平台抢购脚本 项目地址: https://gitcode.com/gh_mirrors/au/autobuy-jd 还在为京东限时秒杀商品总是抢不到而烦恼吗&#xff1f;面对心仪的热…...

大语言模型推理引擎优化:架构挑战与关键技术解析

1. 大语言模型推理引擎的架构挑战与优化方向1.1 Transformer架构的固有瓶颈Transformer架构的自注意力机制存在两大核心瓶颈&#xff1a;计算复杂度和内存占用。对于序列长度N&#xff0c;自注意力层的计算复杂度为O(N)&#xff0c;这使得长文本处理成为性能黑洞。以2048 token…...

实战指南:AI调用成本降71%——利用“推理路由”告别大模型胡乱开销

大多数 AI 应用在刚开始时&#xff0c;都会在代码中硬编码一个模型。对于原型开发来说&#xff0c;这运行得很好&#xff0c;但一旦单个端点需要处理多个复杂的任务类别&#xff0c;这种模式就会分崩崩离析。分类、紧急程度评分、面向客户的草稿以及长篇总结&#xff0c;这些任…...

DPM-Solver代码架构解析:从模型包装器到求解器核心

DPM-Solver代码架构解析&#xff1a;从模型包装器到求解器核心 【免费下载链接】dpm-solver Official code for "DPM-Solver: A Fast ODE Solver for Diffusion Probabilistic Model Sampling in Around 10 Steps" (Neurips 2022 Oral) 项目地址: https://gitcode.…...

YOLO26优化:TIP2026 FourierSR | FourierSR引入YOLO C3k2:解决感受野局限,实现高效全局特征交互

💡💡💡现有 YOLO C3k2 模块主要基于卷积与跨阶段部分连接,虽能平衡计算与精度,但仍存在以下问题: 感受野受限:堆叠的小核卷积(如 33)感受野有限,难以捕获全局上下文,对尺度变化大或远距离依赖的目标(如小目标、遮挡目标)特征提取能力不足。 特征混合效率低:通…...

FRED应用:背散射教程

这个教程描述一个有散射性质的简单plano-plano透镜&#xff0c;这样一条入射光就会散射回发射方向。教程首先&#xff0c;在FRED中创建一个新的系统&#xff0c;在树视图中的Geometry上右击&#xff0c;选择“Create New Lens…”并在出现的对话框上点OK按钮&#xff0c;在全局…...

从堆叠到双线性:手把手图解注意力机制的‘进化史’与PyTorch实现对比

从堆叠到双线性&#xff1a;手把手图解注意力机制的‘进化史’与PyTorch实现对比 在计算机视觉与自然语言处理的交叉领域&#xff0c;注意力机制早已从最初的简单加权求和发展为具有复杂交互能力的计算范式。本文将带您穿越注意力机制的进化长廊&#xff0c;通过PyTorch实战演示…...

3分钟解锁QQ音乐加密文件:qmc-decoder终极使用指南

3分钟解锁QQ音乐加密文件&#xff1a;qmc-decoder终极使用指南 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder 你是否曾经遇到过这样的烦恼&#xff1f;在QQ音乐下载的歌曲…...

不同版本Python安装常见问题与解决方案

1. 如何在特定的版本下安装package (1) 在命令提示符中&#xff0c;打开相应版本python的安装目录&#xff1b; (2) 执行语句python.exe -m pip install XX (3) 更新库 2. 如何在Spyder中设定特定的python解释器 Spyder—Tools—Python Interpreter...