Python递归列表对的总和

时间:2014-08-18 04:26:55

标签: python list recursion sum combinations

我应该编写两个完全相同的函数,但它们的实现是不同的。

该函数将正整数列表和正整数n作为输入,如果列表中的两个数字等于n,则返回True。否则,它返回False。

第一个函数应该使用嵌套的循环,我能够得到它。

第二个函数不应该使用嵌套循环。但是,您应该对列表进行排序,然后解决问题。

这是我对第二个功能的看法。

def pairs2(lst, n):
    lst.sort()
    if len(lst) == 2:
        if lst[0] + lst[1] == n:
            return True
        else:
            return False
    elif len(lst) >= 3:
        for i in range(len(lst) - 1):
            if lst[0] + lst[i + 1] == n:
                return True
        lst.remove(lst[0])
        pairs2(lst, n)

该功能一直有效,直到实现最后两行。在那之后,它不返回任何东西。我的功能出了什么问题?

另外,它们是否是我不使用递归的其他替代方案?我只是提出了使用递归,因为这是我得到的第一个想法。

2 个答案:

答案 0 :(得分:1)

递归算法,在每个递归步骤中消除最大数字:

def pairs2(lst, n, s=False): 
    if len(lst) < 2: return False
    if not s: lst = sorted(lst)
    for item in lst:
        if item + lst[-1] > n:  
            return pairs2(lst[:-1], n, True)
        if item + lst[-1] == n:
            print item, lst[-1]
            return True
    return False

s参数指示列表是否已排序。

答案 1 :(得分:0)

def pairs2(lst, n):
   [pair for pair in itertools.combinations(lst,2) if sum(pair) == n]

您可以使用蛮力方法使用itertools.combinations查找对,而不是使用递归。

详细了解itertools:https://docs.python.org/2/library/itertools.html