2016-07-22 7 views
2

schrieb ich eine Funktion, was in einer Liste, um den Maximalwert hat, zu finden versucht, aus:das maximale Element mit einer rekursiven Funktion Finding

def maxElement(L): 
    length=len(L) 
    if L[length-1]>L[length-2]: 
     del L[length-2] 
     print L 
    elif L[length-1]<L[length-2]: 
     del L[length-1] 
    return L 

print maxElement([1,2,95754754745,3,1,8,444,2,42425]) 

Meine Ausgabe ist falsch:

>>> 
[1, 2, 95754754745L, 3, 1, 8, 444, 42425] 
[1, 2, 95754754745L, 3, 1, 8, 444, 42425] 
>>> 

Es spielt keine Lösche nicht einmal für mich, wonach ich gefragt habe. Was habe ich falsch gemacht? Ich kann es nicht bekommen!

+3

die Funktion, die Sie geschrieben hat, ist nicht rekursiv. Damit eine Funktion rekursiv ist, muss sie sich selbst aufrufen, dh innerhalb des 'def a_function()' -Blocks muss ein 'a_function()' -Aufruf erfolgen. Wie Sie wahrscheinlich wissen und einfach weil es nicht so weit ist, können Sie einfach 'max()' verwenden und Ihre Liste 'L' an sie übergeben wie' max_item = max (L) '. Ich nehme an, Sie wissen das bereits. –

+0

@Rawing Das Hinzufügen einer while-Schleife würde diese Funktion nicht rekursiv machen. – Jokab

+0

Es löschte ein Element - die letzte '2'. –

Antwort

6

Sie rufen Ihre Funktion nicht erneut auf, was Rekursion unmöglich macht. Des Weiteren haben Sie keine Fallbasis die Rekursion aufhören würde, die in diesem Fall wäre:

if length == 1: 
    return L 

Hier ist der feste Code:

def maxElement(L): 
    length=len(L) 
    if length == 1: 
     return L 
    elif L[length-1]>=L[length-2]: 
     del L[length-2] 
    elif L[length-1]<=L[length-2]: 
     del L[length-1] 
    return maxElement(L)  

print maxElement([1,2,95754754745,3,1,8,444,2,42425]) 

Diese Ausgänge:

python recursive.py 
> [95754754745L] 

ich auch hinzugefügt <= und >= auf den Bedingungen, um unendliche Rekursion zu vermeiden, wenn es zwei Elemente gibt, die den maximalen Wert teilen.

+0

vielen Dank, aber warum es druckt die L am Ende: >>> [95754754745L] >>> – Lucia

+0

@Lucia diese Antwort Siehe http://stackoverflow.com/questions/11764713/why-do-integers -in-database-row-tuple-haben-ein-l-suffix – Jokab

6

Es hat genau das, was Sie gefragt haben, zu tun.

Ihre Funktion ist nicht rekursiv, da Sie vergessen haben, sie gegen Ende wieder aufzurufen.

So etwas ist, was Sie suchen:

def maxElement(L): 
    length=len(L) 
    if L[length-1]>L[length-2]: 
     del L[length-2] 
     print L 
    elif L[length-1]<L[length-2]: 
     del L[length-1] 
    if len(L) == 1: 
     return L 
    return maxElement(L) 

print maxElement([1,2,95754754745,3,1,8,444,2,42425]) 

Dies würde zurück:

[1, 2, 95754754745L, 3, 1, 8, 444, 42425] 
[1, 2, 95754754745L, 3, 1, 8, 42425] 
[1, 2, 95754754745L, 3, 1, 42425] 
[1, 2, 95754754745L, 3, 42425] 
[1, 2, 95754754745L, 42425] 
[1, 95754754745L] 
[95754754745L] 
[95754754745L] 

Ich würde es ein bisschen besser machen, wie folgt:

def maxElement(L): 
    length=len(L) 

    if length == 1: 
     # Have this condition on the top because you are using length - 2 later 
     # Just return the only element 

     return L 

    if L[length-1] > L[length-2]: 
     # If the last element is greater than the last but one, delete the last but one 
     del L[length - 2] 

    else: 
     # Simple else would suffice because you are just checking for the opposite 
     # Also this condition saves you from: 
     #  infinite looping when the last two elements are equal 
     del L[length - 1] 

    print L 

    # Time to call it recursively. 
    # But if you just don't want to unnecessarily increase the recursion 
    # tree depth, check for length and return it 

    if length == 1: 
     return L 
    return maxElement(L) 
+0

Während diese Funktion den richtigen Wert für die in der Frage angegebenen Eingabewerte erzeugt, führt dies zu einer unendlichen Rekursion, wenn der maximale Wert in zwei oder mehr Indizes gefunden wird. Siehe meine Antwort. – Jokab

+1

Ja. Überprüft und Upvoted für das gleiche :) Redigiert meine Antwort darauf zu kümmern. –

2

Warum benutzt du nicht einfach max()?

max ([1,2,95754754745,3,1,8,444,2,42425])

95754754745L

+2

Vielleicht OP wollte Rekursion üben. – Jokab

Verwandte Themen