Rekursive Funktion

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
StareDog
User
Beiträge: 50
Registriert: Donnerstag 19. April 2018, 09:59

mhm, klingt natürlich logisch. wie ich das in meinen code implementiere, ist mir nicht klar
StareDog
User
Beiträge: 50
Registriert: Donnerstag 19. April 2018, 09:59

Code: Alles auswählen

def maximum(a,p):                   #Liste a mit Länge p (len(a)=p)
    if p==1 :                        #ist nur ein Element in der Liste
        return a[0]
    else:
        maxi = max(a[1:p+1])         #Suche maximum von a[1] bis a[p]
        if a[0] > maxi :           #prüfe ob gefundenes Element a[maxi] > a[0] ist
            return a[0]
        else:
            return maxi
das hat mir meine Übungspartnerin geschickt. ist das richtig? es scheint zwar die richtige Lösung auszuspucken, aber der rekursive ansatz. ich versteh nicht, wenn return maxi eintritt. wird dann überhaupt das maxi mit dem vorherigen maxi verglichen?
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@StareDog: das ist keine Rekursive Funktion, weil maximum ja nirgends aufgerufen wird, fasst man die vielen if-Blöcke zusammen, ergibt sich nämlich:

Code: Alles auswählen

def maximum(a,p):
    return max(a[:p+1])
StareDog
User
Beiträge: 50
Registriert: Donnerstag 19. April 2018, 09:59

da hast du natürlich recht, blödsinn.

was haltet ihr von dieser Lösung? Ist das eine rekursive Funktion und was hättet ihr noch für bessere lösungsansätze. Hab jetzt die schlechte Lösung abgegeben, weil ich keine Zeit mehr hatte, aber mich gerade nochmal rangesetzt um zu verstehen wie es besser gehen könnte.

Code: Alles auswählen

a = [5,6,7,2,3,2,5,3,7,3,2,7,8]
def maximum(a,p):
    if p<0:
        raise ValueError("cannot find maximum of an empty sequence")
    elif p==0:
        return a[p]
    else:
        if maximum(a,p-1)<a[p]:
            return a[p]
        else:
            return maximum(a,p-1)

print(maximum(a,1))
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Gut, bis auf die quadratische Laufzeit. Du berechnest jeweils zwei mal das Maximum a bis p-1.
StareDog
User
Beiträge: 50
Registriert: Donnerstag 19. April 2018, 09:59

Code: Alles auswählen

if maximum(a,p-1)<a[p]:
            return a[p]
        else:
            return maximum(a,p-1)
du meinst hier return maximum(a,p-1) ist überflüssig? also er rechnet oben das maximum(a,p-1) aus und im else-block noch einmal. geht das mit einer speichervariable?

Code: Alles auswählen

a = [5,6,7,2,3,2,5,3,7,3,2,7,8]
def maximum(a,p):
    if p<0:
        raise ValueError("cannot find maximum of an empty sequence")
    elif p==0:
        return a[p]
    else:
        b = maximum(a,p-1)
        if maximum(a,p-1)<a[p]:
            return a[p]
        else:
            return b

print(maximum(a,6))
Idee war, maximum(a,p-1) wird gespeichert und dann nur noch ausgegeben, anstatt wieder die funktion an dieser stelle wieder neu zu berechnen.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Idee ist richtig, aber nur halb umgesetzt.
StareDog
User
Beiträge: 50
Registriert: Donnerstag 19. April 2018, 09:59

Code: Alles auswählen

a = [5,6,7,2,3,2,5,3,7,3,2,7,8]

def maximum(a,p):
    if p<0:
        raise ValueError("cannot find maximum of an empty sequence")
    elif p==0:
        return a[p]
    else:
        b = maximum(a,p-1)
        c = a[p]
        if b<c:
            return c
        else:
            return b

print(maximum(a,6))
stimmt, ich glaube jetzt hab ich es! Vielen Dank für deine Hilfe!
Antworten