这两段代码之间的区别是什么?

时间:2015-11-15 06:54:55

标签: python python-3.x combinations

我目前在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)

2 个答案:

答案 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替换它。

注意:第一种方法是正确的方法。最大限度地减少依赖关系。