2016-06-25 12 views
-3

Ich habe eine Liste von ganzen Zahlen größer als Null. Ich muss den mit der höchsten Anzahl an Teilern identifizieren. Dafür habe ich zwei Funktionen erstellt: eine, die mir alle Teiler aller Elemente einer Liste gibt, und eine andere, die herausfiltert, welches Element mehr Teiler hat. Das Problem ist, dass ich die maisDivisores-Funktion nicht direkt eine Liste von nur den Elementen erhalten kann (ohne Teiler), weißt du? Wenn ich die Funktion 1 (listaDivisores) innerhalb der Funktion 2 (maisDivisores) aufrufen stürzt immer ab. Wenn ich jedoch manuell anrufe, funktioniert es gut. Ich habe alle Möglichkeiten und nichts ausprobiert. Wie rufe ich die erste Funktion in der Sekunde auf, damit die Bruttoliste funktioniert?Rekursive Funktionsaufruf - Python

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.

+0

keinen Grund Rekursion zu verwenden ?? – Copperfield

+0

SORTIERT !! Löscht die erste Funktion. Ich habe eins gemacht. Daher habe ich ... die grobe Liste hat das erste Element auf eine destruktive Weise gefangen. Mit dem Verständnis der Liste, erstellen Sie eine Liste von Teilern es, wenn die Liste von leer ist, geben Sie die neue Funktion, um alle Elemente zu erhalten, dann wird sie mir eine Liste der Teiler von allen geben. dann können Sie vergleichen und mir das Element zurückgeben, das die größte Anzahl von Teilern hat. –

+0

Recursion fordert den Lehrer auf, das Problem zu lösen. –

Antwort

0

können Sie bequem die Teiler einer Zahl mit Liste Verständnis wie diese

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 ] 

dann erhalten Sie die Build-in max mit einer key Funktion können Sie den Wunsch Ergebnis erhalten

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

, wenn Sie auch den Divisor im gleichen Schritt erhalten möchten, können Sie einen Generator oder Liste Verständnis verwenden, um einen Vermittler Ergebnis zu bauen, von dem die max bekommen

zum Beispiel

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

hier ((x,divisores(x)) for x in test) der Generator , der ein Tupel mit der Anzahl und der Liste der Divisoren

oder

>>> 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]) 
>>>  

und jede dieser vorgenommen werden können, wie in erstellen Funktion implementieren.

Ihre Implementierung ist einfach zu verworren für das, was Sie wollen, und ehrlich gesagt habe ich eine harte Zeit zu verstehen es

+0

Danke Mann! Es wurde viel einfacher. Ich habe vergessen zu erwähnen, dass wir Funktionen wie max, min, sum usw. nicht verwenden könnten, aber könnte eine andere implementieren, um die max. Vielen Dank!! Du hast mich gerettet –

Verwandte Themen