递归函数调用 - Python

时间:2016-06-25 23:49:26

标签: list function python-3.x recursion

我有一个大于零的整数列表。我需要识别分频器数量最多的那个。为此,我创建了两个函数:一个给出了列表中所有元素的所有除数,另一个用于过滤哪个元素具有更多除数。问题是我不能让maisDivisores函数直接接收只有元素的列表(没有分隔符),你知道吗?如果我在函数2(maisDivisores)中调用函数1(listaDivisores)总是崩溃。但是,如果我手动调用它,它的效果很好。我已经尝试了所有的可能性而没有尝试。如何在第二个函数中调用第一个函数来获取总列表?

def listaDivisores(lista):
    if lista == []:
        return []
    else:
        lista=qs(lista)
        resultado=[]
        resultado.append((lista[0],[y for y in range(1,((lista[0])+1)) if (int(lista[0]))%y==0]))
        return resultado+listaDivisores(lista[1:])
    return listaDivisores(lista)


def maisDivisores(lista):

    if len(lista)==[]:
        return "Nenhum número."

    else:
        **lista=listaDivisores(lista)**
        if int(len(lista))==1:
            return lista[0]
        elif int(len(lista[0][1]))<int(len(lista[1][1])):
            lista.pop(0)
        elif int(len(lista[0][1]))==int(len(lista[1][1])):
            if lista[0]<lista[1]:
                lista.pop(0)
            else:
                lista.pop(1)
        else:
            lista.pop(1)
        return maisDivisores(lista)
    return lista

functions working separately; error log when working together.

1 个答案:

答案 0 :(得分:0)

您可以轻松地使用列表理解来获得数字的除数,例如

def divisores(n):
    if n <= 0:
        raise ValueError("n must be positive")
    return [x for x in range(1,n+1) if n%x==0 ]

然后您可以使用max中的内置key功能来获得所需的结果

>>> test=[24, 5, 9, 42] 
>>> max( test, key=lambda x:len(divisores(x)))
24
>>> 

如果你也想在同一步中得到除数,你可以使用生成器或列表推导来构建一个中间结果,从中得到最大值

例如

>>> max( ( (x,divisores(x)) for x in test), key=lambda y:len(y[1]))
(24, [1, 2, 3, 4, 6, 8, 12, 24])

这里( (x,divisores(x)) for x in test)是生成器,它创建一个元组及其除数的列表

>>> test2 = [ (x,divisores(x)) for x in test ]
>>> test2
[(24, [1, 2, 3, 4, 6, 8, 12, 24]), (5, [1, 5]), (9, [1, 3, 9]), (42, [1, 2, 3, 6, 7, 14, 21, 42])]
>>> max(test2,key=lambda x:len(x[1]))
(24, [1, 2, 3, 4, 6, 8, 12, 24])
>>>     

任何一个都可以成为一个简单的功能。

你的实施对于你想要的东西来说太复杂了,坦率地说我很难理解它