上次 Chice_wxg(http://www.myvc.net) 写了一个类似的,PF得一塌糊涂http://expert.csdn.net/Expert/topic/877/877098.xml?temp=.4453241可惜我还是没看懂

解决方案 »

  1.   

    '楼上那位的什么破代码,且看高手如何表演:
    '递归的核心是有个初始函数和一个递归函数
    'Text1中放的是参数n,一个List用来保存结果Private Sub Command1_Click()
        BeginCalc Val(Text1.Text)
    End SubPublic Sub BeginCalc(n As Integer)
        Dim sRet As String
        Dim i As Integer
        List1.Clear
        '初始化为第一级,空串,总共N级
        BeginSub 1, "", n
        '用来显示最后的组合数目
        Text2.Text = List1.ListCount
    End Sub'递归核心
    'nLevel 递归层次
    'Last 上一层递归的结果
    'n为总的递归层次,即N个字符Public Function BeginSub(nLevel As Integer, Last As String, n As Integer) As String
        Dim i As Integer
        Dim sRet As String    For i = 1 To n
            sRet = Last
            '判断是否已经存在当前字符,如果存在,则放弃递归,即不会出现112,223,333之类的重复组合
            If InStr(sRet, Trim(Str(i))) = 0 Then
                
                sRet = sRet & Trim(Str(i))
                '如果递归到最后一层
                If nLevel = n Then
                    '只有递归了N次的字符串才是正解
                    If Len(sRet) = n Then
                        List1.AddItem sRet
                    End If
                Else
                    '加一个层次继续递归
                    BeginSub nLevel + 1, sRet, n
                End If
            End If
        Next i
    End Function' 如果给出如彩票方式的组合,则BeginSub的参数多加一个m 如n=36 m = 7
    Public Function BeginSub(nLevel As Integer, Last As String, n As Integer, m As Integer) As String
        Dim i As Integer
        Dim sRet As String
        Dim nStart As Integer
        If Last = "" Then
             nStart = 1
        Else
             nStart = Val(Right(Last, 1)) + 1
        End If
        For i = nStart To n        sRet = Last
            If InStr(sRet, Trim(Str(i))) = 0 Then
                sRet = sRet & Trim(Str(i))
                If nLevel = m Then
                    If Len(sRet) = m Then
                        List1.AddItem sRet
                    End If
                Else
                    BeginSub nLevel + 1, sRet, n, m
                End If
            End If
        Next i
    End Function提高没有,要看不懂,我只好跳楼了
      

  2.   

    Public Sub sort(str1 As String, str2 As String, i As Integer, n As Integer)
        Dim i1 As Integer
        Dim str As String
        Dim s As String
        str = str2
        For i1 = 1 To i
            str = str & Mid(str1, i1, 1)
            If Len(str) = n Then
                List1.AddItem str
                Exit Sub
            End If
            s = Left(str1, i1 - 1)
            s = s & Right(str1, Len(str1) - i1)
            sort s, str, i - 1, n
            str = Left(str, Len(str) - 1)
        Next i1
    End Substr1为原始字符串,str2为已排序字符,i为剩余字符长度,n为中字符长度
    如"abc"排序则
    sort "abc","",len("abc"),len("abc")
      

  3.   

    to:cdspace(寄情楼主) 
      看明白了,pfpf!!!
      不过你的代码有个小bug:只能正确做10以内的组合。
      If Len(sRet) = m Then 不应该用这个作退出条件  :》to : gcj123(佛的光辉) 
       你的代码非常简练:》
       
        提高!!!
      感谢!!