递归的理解
时间:2022-07-22
本文章向大家介绍递归的理解,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
百度百科:编程语言中,函数Func(Type a,……)直接或间接调用函数本身,则该函数称为递归函数。
更多介绍可以百度。
这里谈一谈自己当时对递归的理解:
递归在程序设计中极其的重要,我觉得就像学Excel函数一定要学会相对引用、绝对应用以及数组公式 一样。
可是递归非常的不好理解,函数竟然要调用本身!我当时接触到递归的时候,对于函数自己调用自己这个逻辑无法理解,就像陷在里面一样。
我们举一个简单的例子,需要输出某个文件夹下所有的文件名称:
Sub TestScanDirR()
ScanDirR ThisWorkbook.path
End Sub
Function ScanDirR(str_dir As String) As Long
Dim fso As Object
Dim file As Object
Dim folder As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder(str_dir)
For Each file In folder.Files
Debug.Print file.name
Next file
Dim subFolder As Object
For Each subFolder In folder.SubFolders
Debug.Print subFolder.path
ScanDirR subFolder.path
Next
Set file = Nothing
Set folder = Nothing
Set fso = Nothing
End Function
ScanDirR subFolder.path这里自己调用了自己,这就是递归,要如何去理解它?
我当时是这样去想的,首先我们手动确认一下到底有几层文件夹,比如是3层,那么ScanDirR subFolder.path必然会执行,我们复制2份ScanDirR函数,分别命名为ScanDirR1,ScanDirR2。
- ScanDirR内部的ScanDirR subFolder.path语句变为ScanDirR1 subFolder.path
- ScanDirR1内部的ScanDirR subFolder.path语句变为ScanDirR2 subFolder.path
- ScanDirR2内部的ScanDirR subFolder.path语句是不会执行的,所以不用考虑
这时候程序先是执行ScanDirR,内部调用ScanDirR1,ScanDirR1再调用ScanDirR2,ScanDirR2没有子文件夹,不会调用其他函数。
ScanDirR2执行完输出文件名后就会返回——然后ScanDirR1返回——最后ScanDirR返回。
这样就是一个正常的函数调用,这样应该非常好理解。
这时候,我们就可以想象了,假如有100次的递归调用,我们可以想象我们的程序里,有100个除了名称不同之外,其他代码完全一样的函数,想象递归就是在逐个的调用100个其他函数。
而实际的递归和这种不同之处只是递归调用的函数名称一样罢了。
- 基于webmagic的爬虫项目经验小结
- Docker Hub工作流程-Docker for Web Developers(6)
- PHP+MySQL代码部署在Linux(Ubuntu)上注意事项
- mac系统上使用压缩包版的mysql(非安装版)
- oracle的decode函数在mysql的实现
- Python的解码和编码
- 原生Ajax总结
- 多个知名化妆品牌现假官网,域名保护该受重视
- JavaScript操作Cookie
- Windows下Go环境安装
- Angular定义服务-Learn By Doing
- JS魔法堂:不完全国际化&本地化手册 之 理論篇
- mysql替换某个字段中的某个字符
- Angular企业级开发(1)-AngularJS简介
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- ZeroLogon(CVE-2020-1472) 分析与狩猎
- 什么是数字资产?
- 我要偷偷的学Python,然后惊呆所有人(第一天)
- Python 中的上下文管理
- 我是如何阅读JDK源码的?
- Docker以root身份登录到容器
- SOAPUI访问WEBSERVICE案例
- 编译安装nginx
- 磁盘高可用解决方案(DBA).md
- Python 3.7 + HttpRunner 初探
- 数据库PostrageSQL-服务器配置(复制)
- 高可用服务解决方案(DBA).md
- dotnet 使用 Interlocked 实现一个无锁的快速无序仅写集合
- 利用Python将gff3转换成gtf格式
- 单细胞DoHeatmap画热图标签出界