Here's a an iterator to generate combinations.
    
    
    iterator choose*[T](a: openarray[T], num_choose: int): seq[T] =
      var
        chosen: seq[T]
        i = 0
        i_stack = newSeqOfCap[int](num_choose)
      
      while true:
        if chosen.len == num_choose:
          yield chosen
          discard chosen.pop()
          i = i_stack.pop() + 1
        elif i != a.len:
          chosen.add(a[i])
          i_stack.add(i)
          inc i
        elif i_stack.len > 0:
          discard chosen.pop()
          i = i_stack.pop() + 1
        else:
          break
    
    
    Run

Example use: 
    
    
    for choice in choose(@[11, 22, 33, 44, 55, 66], 3):
      echo choice
    
    
    Run

Outputs: 
    
    
    @[11, 22, 33]
    @[11, 22, 44]
    @[11, 22, 55]
    @[11, 22, 66]
    @[11, 33, 44]
    @[11, 33, 55]
    @[11, 33, 66]
    @[11, 44, 55]
    @[11, 44, 66]
    @[11, 55, 66]
    @[22, 33, 44]
    @[22, 33, 55]
    @[22, 33, 66]
    @[22, 44, 55]
    @[22, 44, 66]
    @[22, 55, 66]
    @[33, 44, 55]
    @[33, 44, 66]
    @[33, 55, 66]
    @[44, 55, 66]
    
    
    Run

Reply via email to