递归编程
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社群,进行技术交流和提问,获取更多电子资料。