使用递归来概括嵌套的“for”循环

时间:2015-09-18 17:52:30

标签: arrays recursion vbscript

我有一个简单的例程,带有硬编码的嵌套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

任何参赛者?

3 个答案:

答案 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

您使用空前缀调用它。