def combinations(arr, r):
for i in range(len(arr)):
if r == 1:
return [arr[i]]
else:
for next in combinations(arr[i+1:], r-1):
yield [arr[i]] + next
def combinations_with_replacement(arr, r):
for i in range(len(arr)):
if r == 1:
return [arr[i]]
else:
for next in combinations_with_replacement(arr[i:], r-1):
yield [arr[i]] + next
def permutations(arr, r):
for i in range(len(arr)):
if r == 1:
return [arr[i]]
else:
for next in permutations(arr[:i] + arr[i+1:], r-1):
yield [arr[i]] + next
def product(arr, r):
for i in range(len(arr)):
if r == 1:
return [arr[i]]
else:
for next in product(arr, r-1):
yield [arr[i]] + next