[英]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.