繁体   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