我目前在Stackoverflow上查看this answer关于在给定n长字符串的情况下查找k个元素的组合。然而,在对其进行一些更改(为了更多地了解它,根据我的需求调整并将其转换为c)时,我发现了一些问题。
拿这段代码:
def comb(sofar, rest, k):
if k == 0:
print(sofar)
else:
for i in range(len(rest)):
comb(sofar + rest[i], rest[i+1:], k-1)
并添加变量" n"这应该保持字符串的长度:
def comb(sofar, rest, n, k):
if k == 0:
print(sofar)
else:
for i in range(0, n):
comb(sofar + rest[i], rest[i+1:], n-1, k-1)
技术上不应该做同样的事情吗?我的"字符串索引超出范围错误"但是len(rest)应该与" n"?
相同编辑:
用以下方式调用梳子:
comb("", "12345", 3)
通过以下方式调用comb2:
comb("", "12345", 5, 3)
答案 0 :(得分:3)
您致电comb( ..., rest[i+1:], n-1, ...)
,rest[i+1:]
可能会短于n-1
答案 1 :(得分:2)
所以这是代码中的问题:
comb(sofar + rest[i], rest[i+1:], n-1, k-1)
你的尾递归调用不正确。您使用的是rest[i+1:]
,其长度不是n - 1
,原因有两个。您没有更新n
,也没有修改rest
。因此,所有n - 1
的休息时间总是小于i > 0
。
您应该用n - i - 1
替换它。
注意:第一种方法是正确的方法。最大限度地减少依赖关系。