问题描述
我对计算机科学和算法理论的经验很少。我需要按字典顺序生成和打印大小为k的数字1..n重复的所有组合。而且我应该在不使用itertools的情况下做到这一点。我编写了简单的代码来创建所有组合,但这还不足以解决该任务。
n,k = map(int,input().split())
def gen (n,k,prefix):
if len(prefix) == n:
print(*prefix)
return
for c in range(1,n + 1):
if c not in prefix:
gen(n,prefix +[c])
n1 = gen(n,[])
样本输入
3 3
样本输出
1 1 1
1 1 2
1 1 3
1 2 2
1 2 3
1 3 3
2 2 2
2 2 3
2 3 3
3 3 3
请帮我找到解决方案!
解决方法
递归实现:
def combrep(n,k,pos=0,start = 0,l = []):
if pos == k:
print(l)
else:
for i in range(start,n):
combrep(n,pos+1,i,l + [i+1])
combrep(3,3)
[1,1,1]
[1,2]
[1,3]
[1,2,3,3]
[2,2]
[2,3]
[3,3]
,
在documentation中,它表示itertools.combinations_with_replacement
粗略地翻译为此(较小的修改,因此需要一个整数):
def combinations_with_replacement(n,r):
pool = tuple(range(n))
if not n and r:
return
indices = [0] * r
yield tuple(pool[i] for i in indices)
while True:
for i in reversed(range(r)):
if indices[i] != n - 1:
break
else:
return
indices[i:] = [indices[i] + 1] * (r - i)
yield tuple(pool[i] for i in indices)
for i in combinations_with_replacement(3,3):
print(i)
for i in combinations_with_replacement(3,3):
print(i)
(1,1)
(1,2)
(1,3)
(1,3)
(2,2)
(2,3)
(3,3)
我无法想象有一个更简单的实现。为什么不从那里开始?