递归的理解

时间: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个其他函数。

而实际的递归和这种不同之处只是递归调用的函数名称一样罢了。