Rekursiv programmieren (integerbaum)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@d_rose: Wo zählst Du da 5 Elemente? Kannst Du die bitte mal konkret auflisten und wie Du darauf kommst?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
d_rose
User
Beiträge: 57
Registriert: Dienstag 30. Oktober 2018, 11:34

__blackjack__ hat geschrieben: Mittwoch 21. November 2018, 19:39 @d_rose: Wo zählst Du da 5 Elemente? Kannst Du die bitte mal konkret auflisten und wie Du darauf kommst?
Sorry nehme es zurück. Hab mich verguckt:
d_rose
User
Beiträge: 57
Registriert: Dienstag 30. Oktober 2018, 11:34

__deets__ hat geschrieben: Mittwoch 21. November 2018, 15:14 Du baust das ganze nicht rekursiv auf. Du versuchst stattdessen, da irgendwie durch eine Betrachtung des Ganzen weiter zu kommen. Das kann zum Ziel fuehren, soll es aber nicht - du sollst ja lernen, rekursive Strukturen zu verarbeiten und mental in die richtigen, rekursiven Funktionsaufrufe einzusortieren.

Und da sieht das ganze dann anders aus:

- gegeben ein baum, und eine tiefe n
- wenn der baum ein Blatt ist, dann liefere n * baum zurueck.
- sonst teile den baum in links, rechts, mitte auf, und liefere n * mitte + rekursion(links, n + 1) + rekursion(rechts, n + 1) zurueck.

Damit habe ich dir fast schon den Code geliefert.
Jetzt will ich nicht unverschämt rüberkommen , aber wie definiere ich die Bedingung , "wenn der baum ein Blatt ist".
Also was ist das Kriterium für ein Blatt.
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

Habe ich dir schon in meinem zweiten oder so Post geschrieben, wie das gehen kann.
d_rose
User
Beiträge: 57
Registriert: Dienstag 30. Oktober 2018, 11:34

Code: Alles auswählen

a = ((111,-16,-26),81,-7)

def summiere (baum,ebene):
    summe = 0
    y = 0
    x = 0
    z = 0
  
    if  isinstance(baum,int) == True  :
        summe = baum * ebene
    else   :
        x , y , z = baum
    return (y * ebene + summiere(x,ebene+1) + summiere(z,ebene+1))

print(summiere(a,1))


Bitte zerstört mich nicht haha
Jetzt haut der mir den Error raus : Maximum recursion depth exceeded while calling a python object
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

Sinnlose 4 Variablen am anfang. Und ein return fehlt, das andere ist an der falschen Stelle. Wobei das eher eine stilfrage ist.
d_rose
User
Beiträge: 57
Registriert: Dienstag 30. Oktober 2018, 11:34

ach deets ach, ich danke dir vielmals ich würde dich ja gerne für Nachhilfe bezahlen aber wahrscheinlich wohnen wir viel zu weit entfernet voneinander.
wenn du mir erklären könntest warum die 4 Variablen unnötig waren, würde ich mich sehr freuen.
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

Sie werden halt nicht gebraucht. Die x, y, z (ganz miese Namen, sollten besser zb teilbaum_links, wurzel, teilbaum_rechts) sein werden durch das Tupel unpacking erzeugt und Summe ist auch nuztlos - warum hat was mit den returns zu tun.
d_rose
User
Beiträge: 57
Registriert: Dienstag 30. Oktober 2018, 11:34

checke jetzt deine frage nicht.
das ding war ich hatte sie hinzugefügt weil bei mir der error kam : y is referenced before assignment
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ja. Und ich hab dir ja auch was zu den returns gesagt, oder?
d_rose
User
Beiträge: 57
Registriert: Dienstag 30. Oktober 2018, 11:34

ja die returns hab ich drinnen, also das Programm läuft jetzt deswegen hatte ich mich ja bedankt dafür bei dir
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@d_rose: Das kommt weil das ``return`` an der falschen Stelle steht.

Das ``== True`` macht man nicht, weil das sinnlos ist. `isinstance()` gibt ja schon `True` oder `False` zurück. Wenn man `True` mit `True` vergleicht, kommt da bloss wieder `True` heraus, und wenn man `False` mit `True` vergleicht, kommt da wieder `False` bei heraus. Man kann also gleich den Wert nehmen, den man sowieso schon hat.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten