递归python函数的输出

时间:2018-10-17 23:02:01

标签: python recursion output

我的函数有问题,该函数应该在列表中返回所有可能的组合,而无需重复示例。

该功能运行正常,但是我无法获得所有组合的列表:

abc = ['a','b','c','d','e']

def combi(pre, listg, stage=1,first = 1):
    if len(listg)==0:
        return []
    start = first
    lifeat =[]
    for i in range(start,len(listg)):
        lifeat.append(pre + [listg[i]])
        print('stage: ',stage,'|| ',i,' ',pre + [listg[i]])
        diff = set(listg[i:]) - set(pre+[listg[i]])
        seted= [item for item in listg[i:] if item in diff]
        li = combi(pre+ [listg[i]],seted,stage+1, first= 0)
        #print('li : ',li)
    return lifeat+li


def all_combi(liste):
    return combi([liste[0]], liste)
all_combi(abc)

打印结果:print('stage: ',stage,'|| ',i,' ',pre + [listg[i]])

stage:  1 ||  1   ['a', 'b']
stage:  2 ||  0   ['a', 'b', 'c']
stage:  3 ||  0   ['a', 'b', 'c', 'd']
stage:  4 ||  0   ['a', 'b', 'c', 'd', 'e']
stage:  3 ||  1   ['a', 'b', 'c', 'e']
stage:  2 ||  1   ['a', 'b', 'd']
stage:  3 ||  0   ['a', 'b', 'd', 'e']
stage:  2 ||  2   ['a', 'b', 'e']
stage:  1 ||  2   ['a', 'c']
stage:  2 ||  0   ['a', 'c', 'd']
stage:  3 ||  0   ['a', 'c', 'd', 'e']
stage:  2 ||  1   ['a', 'c', 'e']
stage:  1 ||  3   ['a', 'd']
stage:  2 ||  0   ['a', 'd', 'e']
stage:  1 ||  4   ['a', 'e']

这是我得到的输出:output

[['a', 'b'], ['a', 'c'], ['a', 'd'], ['a', 'e']]

在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您的逻辑有几个问题。我强烈建议您使用增量编程来解决您的困难。

  1. 您假定第一个元素是每个组合的必需成员。
  2. 您只能在li循环中附加for的最后一个值; lifeat应该可以全部解决。

对于第二个问题,将return语句更改为两行:

    lifeat += li
return lifeat

这将您的结果提高到

[['a', 'b'], ['a', 'b', 'c'], ['a', 'b', 'c', 'd'], ['a', 'b', 'c', 'd', 'e'],
 ['a', 'b', 'c', 'e'], ['a', 'b', 'd'], ['a', 'b', 'd', 'e'], ['a', 'b', 'e'],
 ['a', 'c'], ['a', 'c', 'd'], ['a', 'c', 'd', 'e'], ['a', 'c', 'e'], ['a', 'd'],
 ['a', 'd', 'e'], ['a', 'e']]

我将初始化问题留给您。