停止递归生成器和置换

2024-10-03 17:18:31 发布

您现在位置:Python中文网/ 问答频道 /正文

作为练习,我一直在尝试用Python生成列表的所有排列的各种方法——递归的、非递归的。。。--并与itertools.permutations()进行性能比较。但是我在递归方法的生成器版本上遇到了问题,它没有以StopIteration异常干净地结束,而是抛出一个IndexError

def spawnperms(alist):
    """same algorithm as recursive option, but a generator"""
    if (alist == []):
        yield []
    for perm in spawnperms(alist[:-1]):
        for i in range(len(perm)+1):
            yield perm[:i] + [alist[-1]] + perm[i:]

从Python解释器调用:

^{pr2}$

哎哟。我试着用pdb来完成它,这几乎在我的大脑中造成了堆栈溢出,但我所理解的是递归“向下”到空列表,然后外部(我想)for循环的索引用完了。在

如何更正代码?在

编辑:从Mark Byers看似简单的正确答案中学到的是,干净的编码实践可以防止错误。如果我在if之后系统地使用了else,不管我是否认为这种情况可能会再次出现,这种情况就不会发生。感觉还是很蠢!在


Tags: 方法in版本列表forif情况性能
1条回答
网友
1楼 · 发布于 2024-10-03 17:18:31

您缺少一个else

if (alist == []):
    yield []
else:
    for ...

这是因为yield的行为方式与return不同。当您请求下一个值时,yield语句之后继续执行。在

相关问题 更多 >