【问题标题】:Python Recursion List Sum of PairsPython递归列表对总和
【发布时间】:2014-08-18 04:26:54
【问题描述】:

我应该编写两个功能完全相同但实现方式不同的函数。

该函数将一个正整数列表和一个正整数 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)

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

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

【问题讨论】:

  • 我怀疑你的意思是return pairs2(lst, n),而不是pairs2(lst, n),这只会把递归获得的结果扔掉..

标签: python list recursion sum combinations


【解决方案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 参数表示列表是否已经排序。

【讨论】:

  • 由于您已经修改了函数签名,我认为解释 s 的用途会有所帮助。
【解决方案2】:
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

【讨论】:

  • 这很好,一切都很好,但我怀疑 OP 正在执行任务,所以没有进一步解释,这个答案并没有真正的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-21
  • 1970-01-01
  • 1970-01-01
  • 2013-03-21
  • 2019-11-30
  • 2012-02-19
  • 2020-03-19
相关资源
最近更新 更多