【问题标题】:Using recursion check each pair in a list, if their sum is negative return True else return False使用递归检查列表中的每一对,如果它们的总和为负,则返回 True,否则返回 False
【发布时间】:2014-10-10 15:44:28
【问题描述】:

这是我目前所拥有的。

def negative_sum(L):  
    if len(L) == 2:  
        if L[0] + L[1] <0:
            return True
        else:
            return False
    else:
        return negative_sum(L[0] + negative_sum(L[1:]))

我的基本情况应该是正确的。我的问题是我最后的 else 声明。我需要它来检查每对列表的总和。我在尝试递归执行此操作时遇到了很多麻烦。任何意见是极大的赞赏。我也不能使用 for 循环。

【问题讨论】:

标签: list python-3.x recursion


【解决方案1】:

while 循环等效于具有单个执行帧的“尾递归”。有些问题用递归更容易表达,有些问题用循环更容易表达。使用嵌套的 for 循环可以轻松生成对。

def pairs1(seq``):
    n = len(seq)
    pairlist = []
    for i in range(0, n-1):
        for j in range(i+1, n):
            pairlist.append((seq[i],seq[j]))
    return pairlist

inp = (1, 2, 3)
out = [(1,2), (1,3), (2,3)]
assert pairs1(inp) == out

我通常会使用yield 而不是pairlist.append。请注意在代码中包含测试。作为中间步骤,转换为单个 while 循环。

def pairs2(seq):
    jmax = len(seq) - 1
    pairlist = []
    i = 0
    j = i+1
    while i < jmax:
        pairlist.append((seq[i],seq[j]))
        if j < jmax:
            j += 1
        else:
            i += 1
            j = i+1
    return pairlist

assert pairs2(inp) == out

现在转换为使用嵌套尾递归闭包而不是 while 语句并不难。

def pairs3(seq):
    jmax = len(seq) - 1
    pairlist = []
    i = 0
    j = i+1
    def inner():
        nonlocal i, j
        if i < jmax:
            pairlist.append((seq[i],seq[j]))
            if j < jmax:
                j += 1
            else:
                i += 1
                j = i+1
            inner()
    inner()
    return pairlist

assert pairs3(inp) == out

这是一种更传统的形式。

def pairs4(seq, i, j, pairlist):
    jmax = len(seq) - 1
    if i < jmax:
        pairlist.append((seq[i],seq[j]))
        if j < jmax:
            return pairs4(seq, i, j+1, pairlist)
        else:
            return pairs4(seq, i+1, i+2, pairlist)
    else:
        return pairlist

assert pairs4(inp, 0, 1, []) == out

严格的功能主义者会用 pairtuple 替换 pairlist,用 () 替换初始的 [],并在递归调用中用元组添加替换 list.append 突变。第一次调用应该是这样的。

        return pairs4(seq, i, j+1, pairtuple + ((seq[i],seq[j])))

在 Python 中,加法中的所有复制都会将 O(N) 函数转换为 O(N**2) 函数,所以我不会那样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    • 1970-01-01
    相关资源
    最近更新 更多