Anfängerin braucht hilfe bei Rekursion-Funktion

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.
Antworten
Annadiz
User
Beiträge: 4
Registriert: Donnerstag 11. November 2021, 17:04

Mittwoch 24. November 2021, 22:42

Hey ich will mit Hilfe von rekursion eine Funktion schreiben.
Mein Ziel ist es, dass wenn ich ZUM BEISPIEL 8765 für n einsetzte, 8+7+6+5 = 26 berechnet wird.
Es sollen nur positive, ganze zahlen übergeben werden.
Benutzeravatar
Dennis89
User
Beiträge: 289
Registriert: Freitag 11. Dezember 2020, 15:13

Mittwoch 24. November 2021, 22:51

Hallo,

wo hast du denn genau die Probleme?
Wie weit bist du?

Grüße
Dennis
“A ship is always safe at the shore, but that is not what it is built for.”
Annadiz
User
Beiträge: 4
Registriert: Donnerstag 11. November 2021, 17:04

Mittwoch 24. November 2021, 23:02

Ich weiß überhaupt nicht wie ich da vorgehen muss bzw anfangen kann.

def checksum(n)
if n > 0
return += n

print(checksum(780))

das war das aller erste was ich probiert hab .... naturlich ist das falsch ;(
Benutzeravatar
/me
User
Beiträge: 3458
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Mittwoch 24. November 2021, 23:21

divmod wäre da ein Ansatz.

Code: Alles auswählen

>>> divmod(5342, 10)
(534, 2)
>>> quotient, remainder = divmod(923587, 10)
>>> quotient
92358
>>> remainder
7
So kommst du schon mal an einzelne Ziffern. Jetzt musst du nur noch Rekursion verwenden und eine geeignete Abbruchbedingung formulieren.

Deinem gezeigten Codeschnipsel nach fehlen dir übrigens absolute Grundlagen. Um Python zu lernen ist dieses Forum allerdings nicht der geeignete Ort. Vielleicht magst du mal ins offizielle Tutorial schauen?
Zuletzt geändert von /me am Mittwoch 24. November 2021, 23:29, insgesamt 1-mal geändert.
Benutzeravatar
Dennis89
User
Beiträge: 289
Registriert: Freitag 11. Dezember 2020, 15:13

Mittwoch 24. November 2021, 23:22

Ausgeschrieben würde 'return += n' bedeuten: 'return = return + n'.
Weist du was return macht?
Wieso prüfst du ob n größer 0 ist? (Die Doppelpunkte würden aber noch fehlen)
Du musst jetzt dein Problem zerlegen. Erstelle mal eine Funktion die 780 übergeben bekommt(so wie du es schon hast) und dann folgende Ausgabe macht:

Code: Alles auswählen

7
8
0
Wenn es zu Fehlern kommt, zeig uns bitte die Fehler und den Code dazu. Am besten du nutzt den vollständigen Editor und die Code-Tags (</> - Button).

Grüße
Dennis
“A ship is always safe at the shore, but that is not what it is built for.”
rogerb
User
Beiträge: 704
Registriert: Dienstag 26. November 2019, 23:24

Mittwoch 24. November 2021, 23:50

@Annadiz,

Bei Rekursionen geht es darum ein großes Problem in immer kleinere Teilprobleme zu zerlegen, bis die Lösung trivial ist.
Der trivialste Fall wäre eine leere Liste. Dann ist die Summe nämlich 0.

Code: Alles auswählen

def addieren(zahlen):
    if not zahlen:
        return 0
Wenn man sein Problem so weit zerkleinert hat, kann man aufhören. Das nennt man den Rekursionsanker.
Um dorthin zu kommen muss man das Problem in Teilprobleme zerlegen.
Also die Summe muss schonmal mindestens so groß sein wie die erste Zahl:

Code: Alles auswählen

def addieren(zahlen):
    if not zahlen:
        return 0
        
    return zahlen[0]
Das klappt schon ganz gut für Listen die kein, oder nur ein Element enthalten.

Und ich weiß ja auch noch das die Gesamtsumme die erste Zahle plus dem ganzen komplizierten Rest sein muss:

Code: Alles auswählen

def addieren(zahlen):
    if not zahlen:
        return 0

    return zahlen[0] + addieren(zahlen[1:])
Das ist der Rekursionsschritt.

Jetzt noch die Funktion aufrufen:

Code: Alles auswählen

def addieren(zahlen):
    if not zahlen:
        return 0

    return zahlen[0] + addieren(zahlen[1:])


summe = addieren([8, 7, 6, 5])
print(summe)
Huch, das war's schon!
Ahris
User
Beiträge: 3
Registriert: Mittwoch 24. November 2021, 19:58

Donnerstag 25. November 2021, 07:00

Hallöchen.
Mein Ansatz wäre der hier:

Code: Alles auswählen

def checksum(number):
    if number > 0:
        number = str(number)
        sum = 0
        for i in number:
            sum += int(i)
        return sum
    else:
        return None
    
print (checksum(2345))
Dabei kann man die Zahl als einzelnen Integer schreiben und muss ihn nicht als Liste übergeben.

Nicht sehr ellegant, aber es funktioniert.
Sirius3
User
Beiträge: 15274
Registriert: Sonntag 21. Oktober 2012, 17:20

Donnerstag 25. November 2021, 07:59

@Ahris: um Fehler zurückzumelden, sind Exceptions besser als None. `sum` ist der Name der `sum`-Funktion, die man hier gut einsetzen könnte. Warum darf man von 0 nicht die Quersumme bilden?

Code: Alles auswählen

def checksum(number):
    if number < 0:
        raise ValueError("number must not be negative")
    return sum(int(digit) for digit in str(number))
In dieser Lösung fehlt jetzt aber die Rekursion.
Ahris
User
Beiträge: 3
Registriert: Mittwoch 24. November 2021, 19:58

Donnerstag 25. November 2021, 08:05

Naja bin selbst noch Anfänger. Die meisten Tricks die andere nutzen kenn ich noch nicht.
Benutzeravatar
__blackjack__
User
Beiträge: 9472
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Donnerstag 25. November 2021, 12:30

@Ahris: Da war jetzt kein ”Trick” dabei.

Code: Alles auswählen

loop_:  cmp     byte [asleep],0
        jne     return
        inc     dword [sheep]
        jmp     loop_
return: ret
Benutzeravatar
/me
User
Beiträge: 3458
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Freitag 26. November 2021, 09:21

Ahris hat geschrieben:
Donnerstag 25. November 2021, 07:00
Mein Ansatz wäre der hier:

[...]
Dein Ansatz ist prinzipiell logisch - nur etwas kompliziert codiert - erfüllt allerdings nicht die Forderung nach einer rekursiven Lösung. Es ist auch keine gute Idee, die von Python als Builtin bereitgestellte Funktion sum mit einer Variable eigenen Namens zu überschreiben.
Antworten