从循环中调用具有指数复杂性的递归代码

时间:2017-02-25 07:23:26

标签: python recursion big-o

此代码作为MIT programming course

中指数复杂性的示例提供
def genSubsets(L):

    if len(L) == 0:
        return [[]] #list of empty set
    smaller = genSubsets(L[:-1]) #all subsets without last element
    extra = L[-1:] #create a list of just the last element
    new = []
    for small in smaller:
        new.append(small+extra) #for all smaller solutions, add one with last element
    return smaller+new #combine those with last element and those without

如果我使用常规列表调用genSubsets,我会得到预期的答案(一组所有可能的子集)。

print(genSubsets([0,1,2]))
#prints - [[], [0], [1], [0, 1], [2], [0, 2], [1, 2], [0, 1, 2]]

但是,如果我尝试从循环内调用它(使用列表解析或使用子循环构造列表),然后调用genSubsets,则函数无法返回预期的答案。

for i in range(4):
    L = []
    for j in range(i):
        L.append(j)
    #print(L) # works as expected
    print(genSubsets([L])) # produces lists of length two regardless of number input list length

我想在循环中调用函数,因为我很想知道返回的子集列表的大小(即长度)随着输入大小的增长而增长,并体验处理时间如何随输入而增加列表大小增加。

1 个答案:

答案 0 :(得分:1)

你给它一个只有一个元素的列表,所以你当然只得到两个子集。将genSubsets([L])更改为genSubsets(L)