我正在尝试查找数字列表的所有加减组合。我想创建一个执行此操作的递归函数,但是在概念上很难做到这一点。这是我的代码,现在]
from itertools import permutations
values = [1, 2]
perm = []
size = 1
while size <= len(values):
perm += permutations(values, size)
size = size + 1
for i in perm:
someFuntion(i)
我希望给定列表的输出是这个。
(1)
(2)
(1 + 2)
(1 - 2)
(2 + 1)
(2 - 1)
有人可以帮我概念化如何编写“ someFunction”吗?
编辑:所以我更新了功能,它适用于大小为2的列表,但是我遇到了较大列表的麻烦。您能帮忙解释一下如何在不将列表传递到函数中的情况下返回列表吗?
def some_function(i, results):
# Base case
if len(i) == 0:
return
# Base case
elif len(i) == 1:
if i[0] not in results:
results.append(i[0])
return i[0]
else:
topVal = str(i.pop(0))
plus = topVal + " + " + str(some_function(i, results))
minus = topVal + " - " + str(some_function(i, results))
results.append(plus)
results.append(minus)
results = []
possibilities = list(flatten(map(lambda s: list(permutations(s)), powerset(values))))
for p in possibilities:
some_function(list(p), results)
print(results)
这是我的列表输出[[1,2,3]
['1', '2', '3', '1 + 2', '1 - 2', '2 + 1', '2 - 1', '1 + 3', '1 - 3', '3 + 1', '3 - 1', '2 + 3', '2 - 3', '3 + 2', '3 - 2', '2 + 3', '2 - 3', '1 + None', '1 - 3', '3 + 2', '3 - 2', '1 + None', '1 - 2', '1 + 3', '1 - 3', '2 + None', '2 - 3', '3 + 1', '3 - 1', '2 + None', '2 - 1', '1 + 2', '1 - 2', '3 + None', '3 - 2', '2 + 1', '2 - 1', '3 + None', '3 - 1']
编辑2:我是根据您的第二次编辑才知道的。感谢您抽出宝贵的时间来指导我。我认为这将有助于我将来更好地编写递归函数。
所以您正在寻找定义一个函数some_function
这样
from itertools import chain, permutations
from more_itertools import powerset, flatten
values = [1, 2]
signs = ["+", "-"]
possibilities = list(flatten(map(lambda s: list(permutations(s)), powerset(values))))
list(flatten([some_function(p) for p in possibilities]))
输出
['', '1', '2', '1 + 2', '1 - 2', '2 + 1', '2 - 1']
我设法在8行中递归定义了函数。其轮廓如下所示。请注意,您可能可以将前两个碱基折叠为一个。
def some_function(i):
if <base case>:
# Base case
elif <second base case>:
# Base case
else:
# Recursive case
关键是要意识到,无论哪种情况,每次都需要返回一个字符串列表。对于递归情况,您要处理元组中的第一个整数,然后信任递归来处理余数。然后使用可能的符号之一将第一个整数与其余部分组合。知道如何插入字符串和使用列表推导(或展平)也可能会有所帮助。
编辑:参见下面的评论。 [1,2,3]的输出如下:
['',
'1',
'2',
'3',
'1 + 2',
'1 - 2',
'2 + 1',
'2 - 1',
'1 + 3',
'1 - 3',
'3 + 1',
'3 - 1',
'2 + 3',
'2 - 3',
'3 + 2',
'3 - 2',
'1 + 2 + 3',
'1 + 2 - 3',
'1 - 2 + 3',
'1 - 2 - 3',
'1 + 3 + 2',
'1 + 3 - 2',
'1 - 3 + 2',
'1 - 3 - 2',
'2 + 1 + 3',
'2 + 1 - 3',
'2 - 1 + 3',
'2 - 1 - 3',
'2 + 3 + 1',
'2 + 3 - 1',
'2 - 3 + 1',
'2 - 3 - 1',
'3 + 1 + 2',
'3 + 1 - 2',
'3 - 1 + 2',
'3 - 1 - 2',
'3 + 2 + 1',
'3 + 2 - 1',
'3 - 2 + 1',
'3 - 2 - 1']
编辑2:
让我们首先进行清理。尝试使列表索引适应;您可能会经常使用它。 i[0]
表示获得列表的开头。 i[1:]
意味着得到所有其他东西(尾巴)。也尽可能不要考虑变异。您只会使问题变得更加棘手。您可以使用append在本地建立列表,但不要将列表传递到另一个函数中(包括递归地),并希望正确地对其进行变异。这是我清理的结果。您快要准备好了!
def some_function(i):
if len(i) == 0:
return [""]
elif len(i) == 1:
return [str(i[0])]
else:
head = str(i[0])
results = some_function(i[1:])
# ...
for result in results:
plus = head + " + " + result
minus = head + " - " + result
# ...
return ...
[首先处理一个简单的元组,例如(1,2)
。尝试将results
视为基本案例(例如["2"]
)的返回值,看看是否可以从那里“构建”下一个案例(例如["1 + 2", "1 - 2"]
)。
我发现的解决方案将对您有所帮助
from itertools import permutations
def someFuntion(value):
a = ['+', '-']
for v in value:
if len(v) == 1:
print(v[0])
else:
for b in a:
print(f'{v[0]} {b} {v[1]}')
values = [1, 2]
perm = []
size = 1
while size <= len(values):
perm += permutations(values, size)
size += 1
someFuntion(perm)