Rekursive Funktion

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich würde für die Endbedingung noch um ein Element weiter gehen:

Code: Alles auswählen

def summe(a, p):
    if p<0:
        return 0
    return a[p] + summe(a, p-1)
StareDog
User
Beiträge: 50
Registriert: Donnerstag 19. April 2018, 09:59

Also du meinst für die Fälle, indem p negativ ist, ist bei mir keine Lösung gegeben und deswegen ist deine Endbedingung besser? bzw. für negative p wird auch a[p] zurückgegeben. Stimmt, danke.

Code: Alles auswählen

a = [1,2,3,4,5,6,7,8,9,10,11]
def summe(a,p):
    if p>0:
        return a[p]+summe(a,p-1)
    if p=0
        return a[p]
    else:
        return (0)

print(summe(a,4))
also so!
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Jetzt ist nur noch der Fall `p=0` falsch geschrieben (==) und überflüssig, weil er schon durch den ersten if-Block abgedeckt wird. Und die Klammern um die 0 gehören weg.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

StareDog hat geschrieben: Sonntag 27. Mai 2018, 13:24 Also du meinst für die Fälle, indem p negativ ist, ist bei mir keine Lösung gegeben und deswegen ist deine Endbedingung besser? bzw. für negative p wird auch a[p] zurückgegeben. Stimmt, danke.

Code: Alles auswählen

a = [1,2,3,4,5,6,7,8,9,10,11]
def summe(a,p):
    if p>0:
        return a[p]+summe(a,p-1)
    if p=0
        return a[p]
    else:
        return (0)

print(summe(a,4))
in deinem ersten Post stand als Aufgabe
"Summe der Elemente eines Feldes a von Position p bis zum Ende des Feldes "
mit obigen Code ist diese Aufgabe nicht erfüllt
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@ThomasL: jetzt willst Du also ernsthaft kritisieren, dass der OP das gelernte an einer modifizierten Aufgabe verifiziert?
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Sirius3 hat geschrieben: Sonntag 27. Mai 2018, 14:20 @ThomasL: jetzt willst Du also ernsthaft kritisieren, dass der OP das gelernte an einer modifizierten Aufgabe verifiziert?
Nein, in keiner Weise.
Keine Ahnung wie du darauf kommst oder wieso du mir das unterstellst.
Ich bin davon ausgegangen, dass der letzte Code die Lösung für die Aufgabenstellung sein soll
und wollte freundlich auf die ursprüngliche Aufgabenstellung aufmerksam machen.
Da steckt in keinem Wort irgendeine Kritik.
Nach nochmaligen Durchlesen der letzten Posts ist mir jetzt diese Zeile
" theoretisch könnte ich ja auch summe von p bis anfang des feldes machen. da müsste ich dann mit p-1 bis Abbruchbedingung p = 0 oder?"
aufgefallen die ich wohl zuvor übersehen habe.
Da ist dann aus dem "theoretisch" sogar Praxis geworden und ich freue mich das der OP
durch unser aller Hilfe etwas gelernt hat.
Deshalb sind wir doch hier aktiv, oder?
Carpe diem
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
StareDog
User
Beiträge: 50
Registriert: Donnerstag 19. April 2018, 09:59

StareDog hat geschrieben: Sonntag 27. Mai 2018, 13:24 Also du meinst für die Fälle, indem p negativ ist, ist bei mir keine Lösung gegeben und deswegen ist deine Endbedingung besser? bzw. für negative p wird auch a[p] zurückgegeben. Stimmt, danke.

Code: Alles auswählen

a = [1,2,3,4,5,6,7,8,9,10,11]
def summe(a,p):
    if p>0:
        return a[p]+summe(a,p-1)
    if p=0
        return a[p]
    else:
        return (0)

print(summe(a,4))
also so!
@Sirius
ok, wenn ich p == 0 wegmache, muss ich aber p>=0 machen, sonst wird ja p==0 nicht berücksichtigt. Da ist deins natürlich einfacher. einfach return 0 für p<0 und für den Rest dann return a[p]+summe(a,p-1).
StareDog
User
Beiträge: 50
Registriert: Donnerstag 19. April 2018, 09:59

in einer zweiten Aufgabe soll ich das Maximum der Elemente eines Feldes a von Position 0 bis p: maximum (a,p) bestimmen. So dürfte ja dann die rekursive schreibweise dafür aussehen.

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:
        return 0
    else:
        return max(maximum(a,p-1),a[p])

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

Du hast das Prinzip verstanden. Nur hier ist die Frage, wie die Endbedingung aussieht. Beim Maximum gibt es ja kein neutrales Element wie bei der Summe (0).
StareDog
User
Beiträge: 50
Registriert: Donnerstag 19. April 2018, 09:59

stimmt, eigentlich müsste es ja dann einen error ausgeben. oder nicht definiert. Die Frage ist, was passiert dann in der Situation wenn max(maximum(a,-1),a[p]) ausgegebeben wird. momentan wäre es ja so, dass 0 das maximum wäre. Wenn alle Zahlen im Feld negativ wären, dann wäre 0 das Maximum, welches gar nicht in der Liste ist. d.h. ich muss für p<0 irgendwie "nicht definiert" oder "error: out of range" oder sowas angeben.

Ist die Denkweise so richtig?

Hab das hier bei Thomas auf der ersten Seite gefunden:
raise "Fehler: Index a muss kleiner gleich Index b sein". Hab das grad mal probiert zu implementieren. Als Syntax scheint das aber irgendwie anders zu funktionieren
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Hier mußt Du tatsächlich zwei Fälle unterscheiden.
1. Was ist das Maximum einer leeren Liste? Schau mal was Pythons max-Funktion dazu sagt.
2. Das Ende der Rekursion ist erreicht, wenn Du nur noch ein Element hast, und was ist das Maximum eines Elements?
StareDog
User
Beiträge: 50
Registriert: Donnerstag 19. April 2018, 09:59

1.ValueError: max() arg is an empty sequence

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:
        print ("error")
    elif p==0:
        return a[p]
    else:
        return max(maximum(a,p-1),a[p])

print(maximum(a,9))
dann dürfte es so stimmen. so gibt es für p<0einen error
für p== 0 wird dann a[p] = a[0] was das maximum ausgegeben und maximum(a,p-1) wird darauf gar nicht abgefragt und wird gar nicht berücksichtigt was das Ergebnis verfälschen könnte. theoretisch könnte ich dann auch bei p<0 return 0 stehen lassen. es würde zumindest das programm nicht behindern, aber wäre natürlich trotzdem falsch.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn man eine eigene Maximumsfunktion schreiben soll, ist es komisch, `max` zu verwenden. Statt `print` sollte man eine Ausnahme werfen: `raise ValueError("cannot find maximum of an empty sequence")`
StareDog
User
Beiträge: 50
Registriert: Donnerstag 19. April 2018, 09:59

du meinst also ich sollte eine Funktion schreiben, die ohne max funktioniert?

Maximum(a,p-1), wird mit a[p] verglichen
dann wird a[p] = a[0] ausgegeben,
dann mit a[1] verglichen
sodass Maximum daraus wieder mit a[2] usw. bis wir bei a[p] sind.

oder wie sieht da der ansatz aus?
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Es ist in einer Übung immer schlecht, innerhalb einer zu erstellenden Funktion eine weitere zu verwenden, die bereits das tut, was erst noch implementiert werden soll. max z.B. würde Deine Aufgabe mit

max(a[:p])

lösen. Für Deine Rekursionsübung solltest Du daher max vermeiden. Als Hilfe könntest Du eine zweite Funktion mymax(a, b) schreiben, die a zurückgibt, wenn a >= b ist und ansonsten b zurückgibt.
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: 17710
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: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Gut, bis auf die quadratische Laufzeit. Du berechnest jeweils zwei mal das Maximum a bis p-1.
Antworten