本帖最后由 JX_shangrila 于 2016-6-17 22:41 编辑
递归代码不是那么容易,看过几位大师的代码。你的二个问题蓝版和香川大师都写过很好的代码,在我以前学习和消化的基础上,略作修改。第一个问题是过程abc,第二个问题是过程abcd。
Dim brr(1 To 1000, 1 To 1)
Dim arr, k%, n%, sj
Sub abc()
k = 0: Erase brr
arr = Range("a2:a" & Range("a65536").End(xlUp).Row)
dg arr, 1, "", 0
Range("c2").Resize(1000) = ""
Range("c2").Resize(k) = brr
End Sub
Sub dg(arr, t, str, y)
If y = [b2] Then k = k + 1:brr(k, 1) = str:Exit Sub
If t < UBound(arr) + 1 Then
dg arr, t + 1, str & arr(t, 1), y + 1
dg arr, t + 1, str, y
End If
End Sub
Sub abcd()
k = 0: n = [b2]: Erase brr
arr = Range("a2:a" & Range("a65536").End(xlUp).Row)
Call dg1(arr, 0, "", 0)
Range("c2").Resize(1000) = ""
Range("c2").Resize(k) = brr
End Sub
Sub dg1(arr, t, str, y)
If y = n Then sj = Split(str, ","): Call dg2("", 0, 1): Exit Sub
For j = t + 1 To UBound(arr)
Call dg1(arr, j, str & "," & arr(j, 1), y + 1)
Next
End Sub
Sub dg2(str$, i%, t%)
str = Replace(str, " ", "")
If t > n And Len(Trim(str)) = n Then k = k + 1: brr(k, 1) = str
If t <= n Then Call dg2(str & sj(t), t, t + 1)
If i > 1 Then Call dg2(Right(str, 1) & Left(str, (t - 2)), i - 1, t)
End Sub