簡體   English   中英

用於顯示列表中所有數字組合的算法

[英]Algorithm to show all combinations of numbers in the list

我如何構建一個遞歸函數來顯示數字列表中所有符號的可能性,例如(5,3,12,9,15)。 列表不會改變,只是每個數字的符號。

例如,結果將是:
(-5,3,12,9,15)
(-5,-3,12,9,15)
(-5,-3,-12,9,15)
(-5,-3,-12,-9,15)

依此類推,直到顯示此列表的所有組合。

我嘗試了幾種不同的方法,包括嘗試從其他類似問題調整代碼,但其中大多數包括更改列表本身。

謝謝!

生成所有可能的5元素二進制列表,例如[0,0,0,0,0], [0,0,0,0,1], [0,0,0,1,0] .. [1,1,0,0,1] ... [1,1,1,1,1] 現在,對於每個列表,請執行以下操作。

如果列表中的第x個位置為1,則將原始列表中的負數替換為此位置的數字。

現在的問題是:如何遞歸生成5個布爾數字的所有列表(二叉樹?)。

在實現遞歸函數時,您需要考慮兩種情況:基本情況和遞歸情況。

在基本情況下,函數不會遞歸調用自身。 在這種情況下它可能會做一些工作,或者它可能什么也不做,因為所有工作都已完成。

在遞歸的情況下,函數做了一些工作,使自己更接近目標,然后遞歸調用自己完成其余的工作。

這是一種解決遞歸函數問題的方法。

在遞歸的情況下,“一點點工作”是將列表中的一個數字的符號設置為正,並且還將該數字的符號設置為負數。 我們需要在兩次分配后遞歸,因為我們需要為每個符號生成組合。

在基本情況下,所有數字都設置了符號,因此我們只打印數字列表。

例如,在Python中,我們可以首先設置函數以獲取數字列表,以及需要其符號集的下一個數字的索引。 首先,下一個數字是列表中的第一個數字,索引為0:

def allSignCombinations(numbers, nextNumberIndex=0):

nextNumberIndex等於len(numbers)時發生基本情況,這意味着沒有數字需要設置它們的符號:

    if nextNumberIndex == len(numbers):
        print numbers

否則,我們會做“一點點工作”。 我們將下一個數字的符號設置為正數和負數,然后我們遞歸每個符號。 當我們遞歸時,如果有一個,我們告訴下一個工作從列表中的下一個數字開始工作:

    else:
        numbers[nextNumberIndex] = abs(numbers[nextNumberIndex])
        allSignCombinations(numbers, nextNumberIndex + 1)
        numbers[nextNumberIndex] = -numbers[nextNumberIndex]
        allSignCombinations(numbers, nextNumberIndex + 1)

在Dilawar的回答基礎上,我提供了一個(重度)pythonic實現(Python語言):

numbers = (5, 3, 12, 9, 15)

for n in range(2**len(numbers)):   # for all possible combinations (power of two)
    binrep = bin(n)[2:]            # get the binary representation as string
    binstring = str(binrep).ljust(5,'0')   # pad with left zeros
    binlist = map(int, reversed([c for c in binstring]))  # convert to a list of integers
    # apply element-wise multiplication with transformed (0,1) => (-1,1)
    print [numbers[n] * (binlist[n]*2 -1) for n in range(len(numbers))]

暫無
暫無

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

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