|
楼主 |
发表于 2012-7-11 11:31
|
显示全部楼层
AVEL 发表于 2012-7-10 21:20
递归一直都学不会。。 群子老师怎么学的?介绍经验。。
嗯。递归其实很简单。
要求:
0. 【申明公共变量】
以便某些【数据】、【变量】在【主过程】和【递归过程】中都能够通用使用。
如: Public sj, jg(), m%, n%, r&
其中,sj 为数据数组,jg为结果数组,m,n为大小参数,r为结果数组的计数
一、 【主过程】 分三部分:
1. 读入原始数据(必要时做一些简单整理),给公共变量赋值或初始化。
2. 调用递归过程
3. 输出递归计算结果
【注意】公共变量在每次代码运行结束后,也会继续留在内存中,
所以每次代码运行前,理论上对所有公共变量都要重新赋值或初始化。
一般变量都会赋值,所以问题不大,但千万不要忘记对计数值r也进行初始化归零,否则会产生计数错误。
二、【递归过程】至少有2部分
1. 结束递归的条件
2. 在循环或判断语句中,可以继续调用自身的代码过程(即进入下一阶层递归的过程)
例如:
Sub mndg(s$, i, t%) '递归过程代码,注意必须要有【参数】输入!
If t = n Then '如果已经计算到最后第n列,则可结束递归了。
【省略结果处理代码】
r = r + 1 '计数值+1
Exit Sub '结束本次递归,返回到上一次递归进程。
End If
'以上,即为终止、结束递归的【条件】的代码。
For j = i + 1 To m '循环过程等
If sj(j, t + 1) <> "" Then Call mndg(s & ";" & j, 0, t + 1) '符合条件时进入下一个递归过程。
Next j
【注意事项】:
递归过程中,必须要有参数的输入如s,i.t,并通过递归计算过程改变参数结果,
并把新的结果作为参数输入到下一阶层的递归过程中去,
这个就是递归过程的输入和输出,
End Sub
………………
因此,
【递归过程】的必须条件,也可以说成是:
1. 参数输入
→ 即获取 s,i,t参数
2. 本次递归计算 或 通过循环获取新的参数
→ 即循环获取新的参数: For j = i + 1 To m
以及,s=s & ";" & j (递归中间结果s的更新,加入符合条件的递归结果j)
i=0 (下一次递归仍从0位置开始)
t=t+1 (本列处理完毕,递增进入下一列)
3. 新的参数输出到下一阶层的递归(调用递归)
Call mndg(s & ";" & j, 0, t + 1)
4. 结束递归的条件(根据条件判断结束本次递归,返回到上一层递归进程。)
If t = n Then
……结果处理
Exit Sub
End If
但是实际上,习惯上第4项的递归退出条件会写在代码开始,以确保每次新的递归过程不发生错误。
|
|