Python 存储递归函数的输出

Python 存储递归函数的输出,python,recursion,return,Python,Recursion,Return,我编写了一个递归函数来获取给定列表的所有可能组合。下面是代码 它接受一个列表参数并打印所有可能的组合 def getCombinations(a): a2 = [] ans = ['' for i in range(len(a))] helper(a,ans,0) def helper(a,ans,i): if i == len(ans): print (ans) else: ans[i] = '' hel

我编写了一个递归函数来获取给定列表的所有可能组合。下面是代码

它接受一个列表参数并打印所有可能的组合

def getCombinations(a):
    a2 = []
    ans = ['' for i in range(len(a))]
    helper(a,ans,0)

def helper(a,ans,i):
    if i == len(ans):
        print (ans)
    else:
        ans[i] = ''
        helper(a,ans,i+1)
        ans[i] = a[i]
        helper(a,ans,i+1)
因此,如果我们调用
getcombines([1,2,3])
,它将按如下方式打印:

['', '', '']
['', '', 3]
['', 2, '']
['', 2, 3]
[1, '', '']
[1, '', 3]
[1, 2, '']
[1, 2, 3]

我的问题是如何将上述结果存储在列表中。我已经尝试寻找解决方案,我知道问题是函数在技术上不会返回任何内容,但即使我尝试用打印(…)替换
返回
,它也不会像预期的那样工作,也不会返回任何内容。

有很多方法可以做到这一点,但从代码开始,将函数转换为生成器可能是最简单的方法

生成器不会一次性返回整个结果,而是在每个元素可用时返回。这样,您就可以用
yield
替换
print
,并通过将对
helper(a,ans,0)
的调用包装在
list()中来收集单个列表中的所有内容

但是,由于您的代码修改了现有的答案,您需要收集列表的副本,而不是列表本身,因为这将在以后的迭代中更改

因此:

但这是一种非常复杂的方法,空字符串非常混乱-为什么不使用标准库:

from itertools import combinations
print([c for n in range(4) for c in combinations([1, 2, 3], n)])
或者,更一般地说,对于任何列表:

from itertools import combinations
def all_combinations(a):
    return([c for n in range(len(a)+1) for c in combinations(a, n)])
print(all_combinations([1, 2, 3]))

您可以使用一个函数,从给定列表中提取第一项,并将其与递归调用返回的每个组合与列表的其余部分连接起来,直到列表变为空:

def getCombinations(lst):
    if lst:
        first, *rest = lst
        for value in '', first:
            for combination in getCombinations(rest):
                yield [value, *combination]
    else:
        yield []
因此
list(getCombinations([1,2,3])
返回:

[['', '', ''],
 ['', '', 3],
 ['', 2, ''],
 ['', 2, 3],
 [1, '', ''],
 [1, '', 3],
 [1, 2, ''],
 [1, 2, 3]]

您必须返回每个代码路径-ans和helper的每个调用。可能的重复并不完全重复,而且我实际上尝试返回ans和函数调用,但没有帮助谢谢您的帮助!看起来生成器是一种方法,我的目标不是得到组合,但我使用的函数看起来有点像这样,但为了简单起见,我在这里编辑了它,以便于理解问题
[['', '', ''],
 ['', '', 3],
 ['', 2, ''],
 ['', 2, 3],
 [1, '', ''],
 [1, '', 3],
 [1, 2, ''],
 [1, 2, 3]]