递归与排列

王朝网络·vb·作者佚名  2006-01-09
宽屏版  字体: |||超大  

笔者曾写过一个递归与组合的算法(http://www.csdn.net/Develop/read_article.asp?id=23809),下面给出一个排列的递归算法,请大家指教。

Private Sub Command1_Click() ' 列出数组a 的全排列

Dim a(8) As String, temp As String

For i = 0 To 8

a(i) = i

Next

temp = permutation(a, UBound(a))

Debug.Print temp

Debug.Print "共有 " & UBound(Split(temp, vbCrLf)) + 1 & " 种排法!"

End Sub

Function addxtostr(ByVal x0 As String, ByVal xadd As String) As String ' eg: x0: "1,2,3,4",we will add 5 to x0

Dim temp, temp2, all() As String, i As Long

temp = Split(x0, ",")

ReDim all(UBound(temp) + 1)

all(0) = xadd & "," & x0 ' return "5,1,2,3,4"

For i = 1 To UBound(all)

temp2 = temp

temp2(i - 1) = temp2(i - 1) & "," & xadd ' add 5 between every two contunious number

all(i) = Join(temp2, ",")

Next

addxtostr = Join(all, vbCrLf)

Set temp = Nothing

Set temp2 = Nothing

Erase all

End Function

Function permutation(ByRef a() As String, ByVal n As Long) As String '列出数组a 的前n-1 个元素的全排列

Dim i As Long, temp, all() As String

If n = 0 Then permutation = a(0)

If n = 1 Then permutation = a(0) & "," & a(1) & vbCrLf & a(1) & "," & a(0)

If n > 1 Then

temp = Split(permutation(a, n ), vbCrLf) ' 递归

ReDim all(UBound(temp))

For i = 0 To UBound(temp)

all(i) = addxtostr(temp(i), a(n))

Next

permutation = Join(all, vbCrLf)

End If

Erase all

End Function

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有