递归vba
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
递归是怎么一回事? 递归通俗的讲就是一个函数在其代码中反复调用自身。你应该知道菲波纳契数列,这个数列的定义是:
f(x)=1 (x=1)
f(x)=2 (x=2)
f(x)=f(x-1)+f(x-2) (x>2)
也就是说从第三项开始的每一项的值都等于是前两项之和。这在数学中叫递推数列--高中数学内容。
说到本质的话,递归是一段程序的代码反复效用,把程序的参数等变量保存在一个堆栈里,直到到了边界条件以后再层层返回,将堆栈中的数据弹出计算,最后得到结果。
补充一下,递规包括直接递规和间接递规。直接递规是指在代码中反复调用自身,而间接递规是间接地调用自身。
递归概念最通俗的形象比喻:
打个比方吧,递归法好比是一个军队要通过一个迷宫,到了第一个分岔口,有3条路,将军命令3个小队分别去探哪条路能到出口,3个小队沿着3条路分别前进,各自到达了路上的下一个分岔口,于是小队长再分派人手各自去探路??只要人手足够(对照而言,就是计算机的堆栈足够),最后必将有人找到出口,从这人开始只要层层上报直属领导,最后,将军将得到一条通路。所不同的是,计算机的递归法是把这个并行过程串行化了。
递归算法的基本思想是:
把规模大的、较难解决的问题变成规模较小的、易解决的同一问题。规模较小的问题又变成规模更小的问题,并且小到一定程度可以直接得出它的解,从而得到原来问题的解。
什么是递归函数(recursive function)
递归函数即自调用函数,在函数体内部直接或间接地自己调用自己,即函数的嵌套调用是函数本身。
VB函数递归使用实例链接:
/t/20050125/22/3753710.html
用VB函数Dir实现递归搜索目录实例链接:
/Develop/article/28/68489.shtm
遍历所有文件夹的递归函数(epower2002)
Sub Main()
ProcessDirectory("E:\My Documents")
Console.ReadLine()
End Sub
Private Sub ProcessDirectory(ByVal targetDirectory As String)
If Directory.Exists(targetDirectory) Then
If Directory.GetFileSystemEntries(targetDirectory).Length = 0 Then
' Empty folder
Console.WriteLine("Folder " & targetDirectory & " is empty")
Else
' Recurse subdirectories of this directory
Dim subdirectory As String
Dim subdirectoryEntries As String() =
Directory.GetDirectories(targetDirectory)
For Each subdirectory In subdirectoryEntries
Console.WriteLine("Folder is " & subdirectory)
ProcessDirectory(subdirectory)
Next subdirectory
End If
End If
End Sub
/art/1111/20041219/692239_1.html
查找给定文件夹下的全部文件,递归调用堆栈溢出:
链接:/t/20060303/09/4589903.html
递归算法
用自身的结构来描述自身,称递归
VB允许在一个Sub子过程和Function过程的定义内部调用自己,即递归Sub子过程和递归Function 函数。递归处理一般用栈来实现,每调用一次自身,把当前参数压栈,直到递归结束条件;然后从栈中弹出当前参数,直到栈空。
递归条件:(1)递归结束条件及结束时的值;(2)能用递归形式表示,且递归向终止条件发展。
例:编fac(n)=n! 的递归函数
Function fac(n As Integer) As Integer
If n = 1 Then
fac = 1
Else
fac = n * fac(n - 1)
End If
End Function
递归程序的基本步骤
每一个递归程序都遵循相同的基本步骤:
1. 初始化算法。递归程序通常需要一个开始时使用的种子值(seed value)。要完成此任务,可以
向函数传递参数,或者提供一个入口函数,这个函数是非递归的,但可以为递归计算设置种子值。
2. 检查要处理的当前值是否已经与基线条件相匹配。如果匹配,则进行处理并返回值。
3. 使用更小的或更简单的子问题(或多个子问题)来重新定义答案。
4. 对子问题运行算法。
5. 将结果合并入答案的表达式。
6.返回结果。
递归算法的基本思想
递归算法一般都包含三个基本部分:
1、当前问题Q n
2、从较简单的问题Q n-1到Q n的操作Op n-1
3、已解决的基础问题Q0
这样,当前问题Q n就可以被一步一步化简为:
Q n
Op n-1 + Q n-1
...
Op n-1 + Op n-2 + Op n-3 ... +Q0
这样一些列确定的步骤而最终得到解决。
递归算法解题的一般思路
在一个子程序(过程或函数)的定义中又直接或间接地调用该子程序本身,称为递归。递归是一种非常有用的程序设计方法。用递归算法编写的程序结构清晰,具有很好的可读性。递归算法的基本思想是:把规模大的、较难解决的问题变成规模较小的、易解决的同一问题。规模较小的问题又变成规模更小的问题,并且小到一定程度可以直接得出它的解,从而得到原来问题的解。
利用递归算法解题,首先要对问题的以下三个方面进行分析:
一、决定问题规模的参数。需要用递归算法解决的问题,其规模通常都是比较大的,在问题中决定规模大小(或问题复杂程度)的量有哪些?把它们找出来。
二、问题的边界条件及边界值。在什么情况下可以直接得出问题的解?这就是问题的边界条件及边界值。
三、解决问题的通式。把规模大的、较难解决的问题变成规模较小、易解决的同一问题,需要通过哪些步骤或等式来实现?这是解决递归问题的难点。把这些步骤或等式确定下来。