我有一个简单的例程,带有硬编码的嵌套for循环,它返回任意数组中的每个唯一的两值组合。也就是说,给定输入数组{A,B,C},输出为:
A B
A C
B C
这是代码(VBScript,不必要):
sub subset2(a)
for i = 0 to ubound(a) - 1
for j = i + 1 to ubound(a)
msgbox(a(i) & " " & a(j))
next
next
end sub
我想概括一下,从输入数组中产生每个独特的n值组合。也就是说,给定输入数组{0,1,2,3,4},我希望能够指定我想要每个两值组合,三值组合等。
这有点递归,我认为John La Rooy可能已经发布了我可以使用的答案(Variable for loops with recursion),但我无法将其映射到VBScript(或C,或JavaScript,或任何东西)否则我很熟悉)并让它发挥作用。
毫无疑问,整个互联网已经知道了答案,并且不需要阅读这么远,这里是返回唯一三值组合的例程:
sub subset3unique(a)
for i = 0 to ubound(a) - 2
for j = i + 1 to ubound(a) - 1
for k = j + 1 to ubound(a)
msgbox(a(i) & " " & a(j) & " " & a(k)
next
next
next
end sub
及其相关输出,给定{A,B,C,D}的输入:
A B C
A B D
A C D
B C D
任何参赛者?
答案 0 :(得分:1)
绝对有助于递归。这是一种方法:
Sub SubsetUnique(n, a)
ForEach n, 0, UBound(a) - (n - 1), "", a
End Sub
Sub ForEach(Level, Min, Max, StartString, a)
For i = Min To Max
If Level = 1 Then
MsgBox StartString & " " & a(i)
Else
ForEach Level - 1, i + 1, UBound(a) - (Level - 2), StartString & " " & a(i), a
End If
Next
End Sub
答案 1 :(得分:0)
对于非递归方法,创建一个数组,其中索引是输出中的位置,值是输入中您为该输出列达到的当前位置。将其初始化为1,2,3等。执行一个循环,在该循环中递增该数组中最后一个未被最大化的位置,然后将所有后续位置重置为等于递增的后续位置。读出每个输出列n的数组[n]的输入值。
答案 2 :(得分:0)
我没有VBScript技能,但是这样的事情可以解决这个问题:
sub subset(n, a, prefix)
if n = 0 then
msgbox(prefix)
else
for i = 0 to ubound(a) - 1
subset(n - 1, a, prefix && " " && a(i))
next
endif
end sub
您使用空前缀调用它。