递归编程

excelperfect

递归编程是一种强大的编程技术,可以极大地简化一些编程任务或者完成一些其他方式无法完成的任务。顾名思义,递归编程就是程序自己调用自己,在调用过程中传入参数的修改值。通常,递归编程包含至少两个过程:设置初始状态并对递归过程进行初始调用的过程;递归过程本身调用一次或多次。

让我们从一个简单的例子开始,这个例子也是介绍递归的经典示例。数字N的阶乘是1和N之间所有整数的乘积,例如5的阶乘等于5 * 4 * 3 * 2 * 1= 120。这里编写程序:第一个名为DoFact的过程进行设置,调用Fact函数并显示结果。

Sub DoFact()

Dim L As Long

Dim N As Long

N = 5

L = Fact(N)

Debug.Print CStr(N) & '的阶乘是' &Format(L, '#,##0')

End Sub

Function Fact(N As Long) As Long

If N = 1 Then

Fact = 1

Else

Fact = N * Fact(N - 1)

End If

End Function

在上述代码中,实际上是由Fact函数来计算数的阶乘的。

测试所输入的值N,如果它是1,该函数只返回1;如果N大于1,Fact函数调用自己传递值N-1。该函数返回作为其结果的输入值N乘以N-1的自身评估值。

注意,在递归编程时,必须小心构建代码,以便在满足某些条件时正确终止程序。在Fact函数过程中,我们在N小于或等于1时结束递归调用。你的递归代码必须具有某种终止递归调用的转义逻辑,如果没有这种转义逻辑,代码将不断循环,直到 VBA 运行时因堆栈空间不足错误而中止处理。注意,你无法使用常规错误捕获来捕获堆栈空间外错误,这被称为不可捕获的错误,将立即终止所有VBA代码的执行,且不能从无法捕获的错误中恢复。

例如,下面是一个不好的递归过程:

Function AddUp(N As Long)

Static R As Long

If N <= 0 Then

R = 0

End If

R = AddUp(N + 1)

AddUp = R

End Function

在这段代码中,没有任何条件阻止AddUp过程调用其自身,对AddUp过程的每次调用都会导致对AddUp过程的另一个调用。该函数将继续不受限制地调用自身,直到VBA运行时中止过程执行序列。

示例:列出文件夹及子文件夹

下面的代码在工作表中列出指定文件夹中的所有子文件夹。

Dim FSO As Scripting.FileSystemObject

Sub StartListing()

Dim TopFolderName As String

Dim TopFolderObj As Scripting.Folder

Dim DestinationRange As Range

TopFolderName = 'D:\完美Excel'

Set DestinationRange =Worksheets(1).Range('A1')

If FSO Is Nothing Then

Set FSO = NewScripting.FileSystemObject

End If

Set TopFolderObj =FSO.GetFolder(TopFolderName)

ListSubFolders OfFolder:=TopFolderObj,DestinationRange:=DestinationRange

End Sub

Sub ListSubFolders(OfFolder As Scripting.Folder, DestinationRange As Range)

Dim SubFolder As Scripting.Folder

DestinationRange.Value = OfFolder.Path

Set DestinationRange =DestinationRange.Offset(1, 1)

For Each SubFolder In OfFolder.SubFolders

ListSubFolders OfFolder:=SubFolder,DestinationRange:=DestinationRange

Next SubFolder

Set DestinationRange = DestinationRange(1,0)

End Sub

希望本文能让你对递归编程有一个基本的了解。递归是一个强大的工具,值得掌握。

注:本文学习整理自cpearson.com,供参考。

欢迎在下面留言,完善本文内容,让更多的人学到更完美的知识。

欢迎到知识星球:完美Excel社群,进行技术交流和提问,获取更多电子资料。

(0)

相关推荐

  • 递归调用函数专题-C语言

    0| 前言 本小节主要学习一种自己嵌套自己的函数调用方法--递归调用 1| 示例 例如,在给定整数n的情况下,计算并输入阶乘n!的程序. 阶乘函数的定义: int factorial(int n){ ...

  • 算法|1到100求和学算法之无尽的递归

    引言递归作为一种算法在程序设计语言中广泛应用,是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现像.绝大多数编程语言支持函数的自调用,在这些语言中函数可以通过调用自身来进行递归.计算 ...

  • 递归函数

    递归函数

  • Python 编程别再用递归了

    递归函数使用起来非常酷,简洁优雅,可以用来炫耀编程技巧.但是,在大多数情况下,递归函数具有非常高的时间和空间复杂性,我们应该避免使用它.更好的解决方案之一是在可能的情况下使用动态规划,对于能够分解为子 ...

  • Py:递归求解汉诺塔,简单的几行编程可以搞定很高层的三柱汉诺塔游戏

    Py:递归求解汉诺塔,简单的几行编程可以搞定很高层的三柱汉诺塔游戏 输出结果 核心代码 def hanoi(n,x,y,z): if n==1: print(x,'--→',z) else: hano ...

  • 11个用于编程和开发的最佳Linux发行版[2021版]

    基于Linux的操作系统是最受欢迎的,并且最适合开发人员和程序员.大多数开发人员使用不同的Linux发行版来迅速完成工作并创建新的东西,但是作为我自己的前开发人员,我主要担心的一个问题是"我 ...

  • 普通二本安逸中堕落最后选择培训拿到13Koffer,有些人真不适合编程

    原本找汪哥是为了帮我筛选下offer的,但是既然要讲,那就来龙去脉捋一捋. 个人经历 我18年毕业于一普通二本,专业电子信息工程,当时校招也不想知道怎么想的,去一线城市进了一家客车企业,干起了机械专业 ...

  • PLC最全编程算法,收藏备用!

    蓝字   '电气达人"  PLC最全编程算法 PLC编程算法(1): PLC中无非就是三大量:开关量.模拟量.脉冲量.搞清楚三者之间的关系,你就能熟练的掌握PLC了. 1. 开关量也称逻辑量 ...

  • 中国科大成功研制62比特可编程超导量子计算处理器,实现可编程的二维量子行走

    合肥讯   中国科大中科院量子信息与量子科技创新研究院(以下简称量子创新研究院)潘建伟.朱晓波.彭承志等组成的研究团队,成功研制了62比特可编程超导量子计算原型机"祖冲之号",并在 ...

  • 西门子PLC编程经典实例

    一.小车往返运动 用S7-200实现小车往返的自动控制 ,控制过程为按下启动按钮 ,小车从左边往右边(右边往左边运动) 当运动到右边(左边)碰到右边(左边)的行程开关后 小车自动做返回运动,当碰到另一 ...

  • 工业机器人零基础PLC编程的基本步骤

    科学的PLC编程步骤其实很简单,但往往大多数工程师就是认为简单而忽略很多细节.细节的忽略,必然会在以后出现问题.想避免日后的问题,只有好好的遵守规则,没有规矩不成方圆,plc编程一样有其自身的规矩. ...

  • 6种S7-200PLC最基础的编程实例图

    6种S7-200PLC最基础的编程实例图