本帖最后由 bcrun 于 2013-01-19 09:56:01 编辑

解决方案 »

  1.   

    递归函数可以使用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
      

  2.   

    如果是N选M怎么能用循环呀,N和M事先都不能确定
    如果M是1000,你要写一千个循环语句吗????!!
    所以还得用递归