在Python 3中递归减法(列表)

时间:2016-03-01 11:34:39

标签: python-3.x recursion

我知道如何递归地在列表中添加数字

def mysum(L):
    if not L:
        return 0
    else:
        return L[0] + mysum(L[1:])

你能帮助我以相同的方式递归地构建减法(只有一个输入 - 列表)。

mydiff([10,1,2,3])  

非常感谢

2 个答案:

答案 0 :(得分:1)

如果序列为(3,2,1),则结果为0.但如果使用2 -1,则减法反向,即3 - (2-1)而不是return L[0] - mysum(L[1:])

所以我们必须使用一个累加器来保持序列的第一个和第二个元素的差异。

def mydiff(L, acc=None):
    if not L:
        return acc
    else:
        if acc is None:
            acc = L[0] - L[1]
            L = L[2:]
        else:
            acc -= L[0]
            L = L[1:]
        return mydiff(L, acc)

更简单;

def mysub(seq, acc=None):
    seq = iter(seq)
    if acc is None:
        item = next(seq, None)
        if item is None:
            return acc
        acc = item

    item = next(seq, None)
    if item is None:
        return acc
    return mysub(seq, acc - item)

答案 1 :(得分:1)

要完成的计算是

>>> 10-(1+(2+(3+0)))
4

所以第一个操作是减法,但其余的操作仍然是加法。如果您不允许在主函数中添加第二个参数,我认为您需要使用内部函数:

def mydiff(L):
    def sub(L, first=False):
        if not L:
            return 0
        else:
            if first:
                return L[0] - sub(L[1:])
            else:
                return L[0] + sub(L[1:])
    return sub(L, True)

测试:

>>> mydiff([10,1,2,3])
4