【发布时间】:2015-12-28 16:55:16
【问题描述】:
下面是我的代码。我想通过递归方法达到相同的结果,因为嵌套循环的数量从 2 到最大 8 不等。
Sub permutation()
c1 = Array(1, 2)
c2 = Array(3, 4)
c3 = Array(5, 6)
c4 = Array(7, 8)
c5 = Array(9, 10)
c6 = Array(11, 12)
c7 = Array(13, 14)
c8 = Array(15, 16)
With Sheets("Criteria")
.Cells.Clear
n = 1
For a = LBound(c1) To UBound(c1)
For b = LBound(c2) To UBound(c2)
For c = LBound(c3) To UBound(c3)
For d = LBound(c4) To UBound(c4)
For e = LBound(c5) To UBound(c5)
For f = LBound(c6) To UBound(c6)
For g = LBound(c7) To UBound(c7)
For h = LBound(c8) To UBound(c8)
Cells(n, 1).Value = c1(a)
Cells(n, 2).Value = c2(b)
Cells(n, 3).Value = c3(c)
Cells(n, 4).Value = c4(d)
Cells(n, 5).Value = c5(e)
Cells(n, 6).Value = c6(f)
Cells(n, 7).Value = c7(g)
Cells(n, 8).Value = c8(h)
n = n + 1
Next h
Next g
Next f
Next e
Next d
Next c
Next b
Next a
End With
End Sub
我还在互联网上找到了一个递归代码示例,但我真的不知道如何根据我的需要进行修改。任何帮助都会非常棒。
递归代码示例
Sub RecurseMe(a, v, depth)
If a > depth Then
PrintV v
Exit Sub
End If
For x = 1 To 4
v(a) = x
a = a + 1
RecurseMe a, v, depth
a = a - 1
Next x
End Sub
Sub PrintV(v)
For J = 1 To UBound(v): Debug.Print v(J) & " ";: Next J
Debug.Print
End Sub
Sub test()
Dim v()
depth = 4 'adjust
a = 1
ReDim v(1 To depth)
RecurseMe a, v, depth
End Sub
问候
【问题讨论】:
-
你能重申你的目标吗?你想做什么?
-
我想将循环数设置为变量。例如在上面的示例中,我使用了 8 个循环,因此输出为 2^8=256。但有时我只需要 2 个。所以输出将是 2x2 矩阵。
-
它只是填充了我数组中的数据。此数组长度是可变的,因此所有循环都根据每个数组长度运行。
-
如果你想获得不同数组元素的完全外连接,你可以看看这个问题:link。有范围而不是数组,但很容易适应。无需递归。
-
@BradNicku,很棒的链接!我在同一个帖子上做了回答。 OP 应该考虑到工作簿的 VBA 记录集连接,并跨所有数组运行笛卡尔叉积 SQL。
标签: excel vba for-loop recursion permutation