尝试构建电源设置功能

时间:2016-01-26 19:39:23

标签: python recursion

我正在尝试构建电源设置功能。 当我将其构建为生成器时,它可以正常工作。

但我想把它写成常规功能

def power_set(group):
    if len(group)==0:
        return set()
    else:
        last=group.pop()
        for sub in power_set(group):
            return (sub|{last})
            return (sub)

任何人都知道问题可能是什么?

2 个答案:

答案 0 :(得分:1)

您尝试通过将所有yield简单地更改为return来将生成器转换为函数。这几乎永远不会奏效,因为它完全改变了流程。产量后,生成器函数将继续,但返回将永久返回。

在您的情况下,首先将大型集合传递到power_set()函数。它会愉快地递归,每次减少一件物品,直到它击中一件物品。此时,pop()语句将删除最后一项,然后它将以空集作为输入调用power_set()。这将立即作为空集返回,导致for循环评估为:

for sub in set():

由于它是空的,它将跳过for循环(两个return s)的主体并到达函数的末尾,因此根据定义返回None。这会导致递归堆栈再展开一个级别并尝试执行:

for sub in None:

这就是您获得例外的原因。

要修复它,您不能一次返回一个值,但必须一次性返回power_set()特定调用的所有值。

def power_set(group):
    if len(group)==0:
        return [set()]
    else:
        last=group.pop()
        s = []
        for sub in power_set(group):
            s.append(sub|{last})
            s.append(sub)
        return s

答案 1 :(得分:0)

您可以懒惰,只需创建一个包含生成器版本

生成的所有项目的列表
powSet = list( power_set_generator(group) )

假设power_set_generator()是您的生成器版本,可以正常工作。