如何限制Python递归组合?

如何限制Python递归组合?,python,recursion,limit,combinations,Python,Recursion,Limit,Combinations,我目前正在尝试解决一个问题,如何让这段代码遍历下面的不同数字组合,使其等于1200。这很好,但是我希望代码限制它探索的数字,并且只打印5个不同数字的组合 E.g170、260、280、290、300=1200,使用5个数字。我只想要这些组合。 E.G210、20、30、40、110、120、160、190、240、280=1200,使用10个数字。我不想要小于5或大于5的组合,就像这个组合 我对python不太了解,我觉得这是一件简单的事情,但由于我有限的编码知识,我被卡住了 #!/usr/lo

我目前正在尝试解决一个问题,如何让这段代码遍历下面的不同数字组合,使其等于1200。这很好,但是我希望代码限制它探索的数字,并且只打印5个不同数字的组合

E.g170、260、280、290、300=1200,使用5个数字。我只想要这些组合。

E.G210、20、30、40、110、120、160、190、240、280=1200,使用10个数字。我不想要小于5或大于5的组合,就像这个组合

我对python不太了解,我觉得这是一件简单的事情,但由于我有限的编码知识,我被卡住了

#!/usr/local/bin/python
from itertools import combinations

def find_sum_in_list(numbers, target):
    results = []
    for x in range(len(numbers)):
        results.extend(
            [   
                combo for combo in combinations(numbers ,x)  
                    if sum(combo) == target    
            ]
    )
    print results

if __name__ == "__main__":
    find_sum_in_list([10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200,210,220,230,240,250,260,270,280,290,300], 1200)

谢谢你的帮助。非常感谢。

我认为第二个参数是要组合的项目数。试着传递5而不是x,好吧,它的递归性不亚于你的代码,但我认为它可以满足你的需要

import itertools

target_list = [
    10, 20, 30, 40, 50, 60, 70, 80, 
    90, 100, 110, 120, 130, 140, 150, 
    160, 170, 180, 190, 200, 210, 220, 
    230, 240, 250, 260, 270, 280, 290, 300
]

target_sum = 1200

def find_sum(target_list, num_elem, target_sum):
    combinations = itertools.combinations(target_list, num_elem)

    for comb in combinations:
        if sum(comb) == target_sum:
            print comb


find_sum(target_list, 5, target_sum)

你在正确的轨道上,但我不认为你需要做什么递归。我认为这是可行的

from itertools import combinations

def find_sum_in_list(numbers, target, comboSize):
    results = []
    for combo in combinations(numbers, comboSize):
        if sum(combo) == target:
            results.append(combo)
    return results


if __name__ == "__main__":
    numbers = [10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200,210,220,230,240,250,260,270,280,290,300]
    total = 1200
    comboSize = 5
    print find_sum_in_list(numbers, total, comboSize)

实际上,你几乎拥有了你所需要的。正如@Eric所说,列表中的两行几乎是所有内容,除了使用“5”而不是“x”。如果您使用过滤器剔除所有总和不正确的组合,那么您将得到:

from itertools import combinations

def find_sum_in_list(numbers, target):
    return filter(lambda x: sum(x) == target, combinations(numbers, 5))

if __name__ == '__main__':
    print find_sum_in_list(range(10, 310, 10), 1200)
filter接受一个函数,该函数接受列表中的每个元素并返回true或false。我向其中传递了一个匿名函数,该函数仅当列表与目标求和时才返回true


我还使用range生成数字列表,从10到310乘以10。range不包括最后一个元素。

有两件事:1)我看不出你的函数是如何递归的。它不叫自己。2) 如果您只需要5个元素的组合,为什么要循环使用
x
的不同值,并要求使用
x
元素的组合?对不起,这种数学我无法理解。我试着把5放进x,它确实起作用了。在我意识到我的错误之前,我需要有人指出这一点。谢谢。谢谢。这个代码看起来也不错。你写得也很清楚,所以我更容易理解。@Metori没问题。你当然可以用杰克的答案来简短地回答,但这听起来很重要,这是可以理解的。别忘了对你喜欢并接受的答案进行投票。这个解决方案唯一的问题是主块中的额外循环。他只需要五个数字组合,这给了他更多。这是一个聪明的方法,谢谢。然而,我想运行其他的数字组合,有些是重复的,所以可能有两个10或三个30。我认为我不能用这个方法,因为它是一个范围而不是离散的数字。不客气。不过,您可以在列表实现中使用这个find\u sum\u。这不是我使用范围的具体情况。对不起,我的错误是:P。我没有仔细阅读你的代码。我也很喜欢你的方法。它似乎很快就能说出这些组合。