python生成器函数不支持的朴素置换算法

2024-04-16 17:38:01 发布

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

伙计们。 似乎我并不真正理解Python生成器函数的概念,因为我还没有发现这段代码中的错误,它应该产生所有字符串的排列。你知道吗

例如,这个是基于简单的集合展开的,它是有效的

def permutations(seq):
    perm_set = set()

    def perm(cur_item_set, cur_str=''):
        if not cur_item_set:
            perm_set.add(cur_str)
        else:
            for item in cur_item_set:
                perm(cur_item_set - set(item), cur_str + item)

    perm(set(seq))

    for (i, item) in enumerate(perm_set):
        print(i + 1, item)

    permutations('abcdef')

同时,此代码不起作用:list(g)提供[]

def gen_perm(cur_item_set, cur_str=''):
    if not cur_item_set:
        yield cur_str
    else:
        for item in cur_item_set:
            gen_perm(cur_item_set - {item}, cur_str + item)

g = gen_perm(set('abcd'))

Tags: 代码inforifdefnotitemelse
1条回答
网友
1楼 · 发布于 2024-04-16 17:38:01

递归调用gen_perm()时,不会对返回值做任何操作。你知道吗

如果您的Python版本(3.3及更高版本)中有yield from,请尝试这样做:

def gen_perm(cur_item_set, cur_str=''):
    if not cur_item_set:
        yield cur_str
    else:
        for item in cur_item_set:
            yield from gen_perm(cur_item_set - {item}, cur_str + item)

g = gen_perm(set('abcd'))
print (list(g))

或者这将适用于所有Python版本。你知道吗

def gen_perm(cur_item_set, cur_str=''):
    if not cur_item_set:
        yield cur_str
    else:
        for item in cur_item_set:
            for item2 in gen_perm(cur_item_set - {item}, cur_str + item):
                yield item2

g = gen_perm(set('abcd'))
print (list(g))

相关问题 更多 >