递归函数可以使用byref类型的参数,这样可以修改参数,传递给上层调用函数,从而返回多个返回值.比如递归函数返回的是字符串,并且把参数修改为特殊值,这样上层调用函数检查到这个参数的值变化为特殊值,就结束本层调用,并修改自己的参数回到上层调用.而递归函数的返回值还是可以返回的. Option ExplicitPrivate Sub Form_Load() Dim s As String, i As Long, m As Long s = "1,3,5,7,9,0" Debug.Print GetNum(s, 3, False) End Sub Function GetNum(ByVal s As String, ByVal num As Long, Flag As Boolean) As String 's 集合,从集合里挑选组合 'num,组合的长度 'flag 标记,true后就不再调用getnum Dim x, y Dim ret As String, ret1 As String '递归调用,先看看参数是不是可以直接返回 If num = 0 Or s = "" Then GetNum = "" Exit Function ElseIf num = 1 Then GetNum = s Exit Function End If '集合分解为数组 x = Split(s, ",") Dim m As Long, l As Long '两个计数变量For m = 0 To UBound(x) '遍历s中的每个元素 '从s集合剔除一个元素,用剩下的集合去组合'剔除,小心","的问题 If m <> UBound(x) Then ret = Replace(s, x(m) & ",", "") Else ret = Replace(s, "," & x(m), "") '组合,递归调用 ret = GetNum(ret, num - 1, Flag) '对返回的结果进行判断 If Flag = True And ret <> "" Then GetNum = ret Exit Function End If If ret = "" Then GetNum = "" Exit Function End If 's中的每个元素与getnum的结果组合,产生需要的长度 y = Split(ret, ",") For l = 0 To UBound(y) '这个if纯粹是控制","来着 If ret1 = "" Then ret1 = x(m) & y(l) Else ret1 = ret1 & "," & x(m) & y(l) End If Next l If num = 3 Then 'LZ要求的,3个数字合是4就退出,长度是3才判断,其他时候就不判断了 y = Split(ret1, ",") '分解现有的组合为数组 '每个元素都判断各位和是不是4 For l = 0 To UBound(y) If Val(Mid(y(l), 1, 1)) + Val(Mid(y(l), 2, 1)) + Val(Mid(y(l), 3, 1)) = 4 Then Debug.Print y(l) GetNum = ret1 Flag = True Exit Function End If Next l End If GetNum = ret1 Next m End Function
Option ExplicitPrivate Sub Form_Load()
Dim s As String, i As Long, m As Long
s = "1,3,5,7,9,0"
Debug.Print GetNum(s, 3, False)
End Sub
Function GetNum(ByVal s As String, ByVal num As Long, Flag As Boolean) As String
's 集合,从集合里挑选组合
'num,组合的长度
'flag 标记,true后就不再调用getnum
Dim x, y
Dim ret As String, ret1 As String
'递归调用,先看看参数是不是可以直接返回
If num = 0 Or s = "" Then
GetNum = ""
Exit Function
ElseIf num = 1 Then
GetNum = s
Exit Function
End If
'集合分解为数组
x = Split(s, ",")
Dim m As Long, l As Long '两个计数变量For m = 0 To UBound(x) '遍历s中的每个元素
'从s集合剔除一个元素,用剩下的集合去组合'剔除,小心","的问题
If m <> UBound(x) Then ret = Replace(s, x(m) & ",", "") Else ret = Replace(s, "," & x(m), "")
'组合,递归调用
ret = GetNum(ret, num - 1, Flag)
'对返回的结果进行判断
If Flag = True And ret <> "" Then
GetNum = ret
Exit Function
End If
If ret = "" Then
GetNum = ""
Exit Function
End If
's中的每个元素与getnum的结果组合,产生需要的长度
y = Split(ret, ",")
For l = 0 To UBound(y)
'这个if纯粹是控制","来着
If ret1 = "" Then
ret1 = x(m) & y(l)
Else
ret1 = ret1 & "," & x(m) & y(l)
End If
Next l
If num = 3 Then 'LZ要求的,3个数字合是4就退出,长度是3才判断,其他时候就不判断了
y = Split(ret1, ",") '分解现有的组合为数组
'每个元素都判断各位和是不是4
For l = 0 To UBound(y)
If Val(Mid(y(l), 1, 1)) + Val(Mid(y(l), 2, 1)) + Val(Mid(y(l), 3, 1)) = 4 Then
Debug.Print y(l)
GetNum = ret1
Flag = True
Exit Function
End If
Next l
End If
GetNum = ret1
Next m
End Function
如果M是1000,你要写一千个循环语句吗????!!
所以还得用递归