复杂的递归函数

时间:2016-05-06 12:58:40

标签: python recursion

我需要编写一个函数 nested_sum(L),它将对列表中的所有整数求和,无论它们是否在另一个列表中。这与再次调用另一个函数 mult2(n)

示例:

>>> nestedSum(mult2( [1,['a',3,'b',2],[4,['h',8,[10]]], -5]))
24

我试图对此进行编码:

def mult2(n):
    if type(n) == int and n%2 ==0:
        return n

def nested_sum(L):
    total = 0 
    for i in L:
        if isinstance(i, list):  
            total += nested_sum(i)
        else:
            total += i
    return total

不幸的是我无法改变mult2(n)函数的代码。我只能更改nested_sum(L)函数。

有人可以告诉我该怎么做? 谢谢。

3 个答案:

答案 0 :(得分:2)

将递归分离成一个只执行以下操作的函数会更好:

sum(x for x in iflatten(L) if cond)

其中iflatten是展平函数的迭代器返回版本,而cond就是type(x) == int and x % 2 == 0

def iflatten(L):
    for i in L:
        if isinstance(i, list):  
            for r in iflatten(i):
                yield r
        else:
            yield i

代码测试如下:

L = [1,['a',3,'b',2],[4,['h',8,[10]]], -5]

def iflatten(L):
    for i in L:
        if isinstance(i, list):  
            for r in iflatten(i):
                yield r
        else:
            yield i

sum(x for x in iflatten(L) if type(x) == int and x % 2 == 0)

结果为24

你无法改变

def mult2(n):
    if type(n) == int and n%2 ==0:
        return n

我们可以将条件从type(x) == int and x % 2 == 0更改为mult2(x) is not None,因为所有函数的末尾都有隐式return None

让我们测试一下:

L = [1,['a',3,'b',2],[4,['h',8,[10]]], -5]

def iflatten(L):
    for i in L:
        if isinstance(i, list):  
            for r in iflatten(i):
                yield r
        else:
            yield i

def mult2(n):
    if type(n) == int and n%2 ==0:
        return n

sum(x for x in iflatten(L) if mult2(x) is not None)

同样会产生24

答案 1 :(得分:2)

我不确定示例调用是否正确:

nestedSum(mult2( [1,['a',3,'b',2],[4,['h',8,[10]]], -5]))

在列表中调用mult2()将始终返回None。将None传递给nestedSum()将始终导致TypeError

mult2()旨在过滤掉非整数和奇数整数。我认为你应该将mult2作为过滤函数传递给nestedSum()

def mult2(n):
    if type(n) == int and n%2 ==0:
        return n

def nested_sum(L, predicate):
    total = 0
    for item in L:
        if isinstance(item, list):  
            total += nested_sum(item, predicate)
        elif predicate(item):
            total += item
    return total

现在要调用该函数,将mult2()作为谓词函数传递给nested_sum():

>>> nested_sum([1,['a',3,'b',2],[4,['h',8,[10]]], -5], mult2)
24

答案 2 :(得分:0)

如果您可以在不使用mult2的情况下执行此操作但仍必须使用递归,则可以执行此操作:

def sumArr(arr):
    return sum([numVal(item) for item in arr])

def numVal(item):
    if instanceof(item, int): return item
    elif instance(item, list): return sumArr(item)
    else: return 0

sumArr([1,['a',3,'b',2],[4,['h',8,[10]]], -5]) # >>> 23