簡體   English   中英

存儲遞歸函數的輸出

[英]Store output of a recursive function

我編寫了一個遞歸函數來獲取給定列表的所有可能組合。 下面是代碼。

它使用一個列表參數並打印所有可能的組合。

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)

因此,如果我們調用getCombinations([1,2,3]) ,則輸出如下:

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

我的問題是如何將以上結果存儲在列表中。 我試圖尋找解決方案,並且我知道問題是函數從技術上講不會返回任何內容,但是即使我嘗試用print(...)替換return也不起作用,也不會返回任何內容。

有很多方法可以執行此操作,但是從代碼開始,將函數轉換為生成器可能是最簡單的。

生成器不會一次返回整個結果,而是在每個元素可用時返回。 這樣,您可以將print替換為yield並通過將對helper(a,ans,0)的調用包裝在list() ,將所有內容收集在一個list()

但是,由於您的代碼修改了現有答案,因此您需要收集列表的副本,而不是列表本身,因為這將在以后的迭代中更改。

所以:

from copy import copy

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

def helper(a,ans,i):
    if i == len(ans):
        yield copy(ans)
    else:
        ans[i] = ''
        yield from helper(a,ans,i+1)
        ans[i] = a[i]
        yield from helper(a,ans,i+1)

print(getCombinations([1,2,3]))

但是,這是一種非常復雜的方法,而且對於空字符串也很混亂-為什么不使用標准庫:

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]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM