def ByRecursiveGeneratorAlrgorithm(*sets):
   """Returns a generator that yields one tuple per element combination.
      A set may be any iterable to which the not operator is applicable.
   """
   if not sets: return
   def calc(sets):
      head, tail = sets[0], sets[1:]
      if not tail:
         for e in head:
            yield (e,)
      else:
         for e in head:
            for t in calc(tail):
               yield (e,) + t
   return calc(sets)
Returns a generator that yields one tuple per element combination.
      A set may be any iterable to which the not operator is applicable.
   
recipes/Python/410685_Generic_vs_Specific_Algorithms__Obtaining_All/recipe-410685.py