分享

递归编程

 hercules028 2021-08-27

excelperfect

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

让我们从一个简单的例子开始,这个例子也是介绍递归的经典示例。数字N的阶乘是1N之间所有整数的乘积,例如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大于1Fact函数调用自己传递值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

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多