einstellige quersumme berechnen

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
capawe
User
Beiträge: 4
Registriert: Montag 11. November 2013, 17:11

Hallo liebes Forum,
da ich neu in Python bin werde ich euch ab jetzt sicher des öfteren mit meinen Fragen behelligen. Hier also meine erste.
zunächst möchte ich noch anmerken, dass ich gerade ein Studium der Informatik begonnen habe und es sich vermutlich meistens um meine Hausaufgaben handelt. Ich werde allerdings versuchen die Probleme die ich damit habe so weit wie möglich zu konkretisieren und wenn möglich schon irgendwie fabrizierten code zu posten, der bis jetzt nicht das tut was er soll.
Also, hier ist das gute Stück. Es soll die einstellige Quersumme einer Zahl berechnen. Dazu habe ich mir also erst eine Funktion geschrieben, die mir die Quersumme berechnet und dann eine weitere, die wenn die eingegebene Zahl größer 9 ist, also mehr als 1 Stelle besitzt nochmal die quersumme berechnet.
bei größeren zahlen bekomme ich nun als Rückgabe immer ein 'None' und kann mir nicht wirklich erklären woran das liegt.

Code: Alles auswählen

def quersumme(zahl:int) -> int:
    x = 0
    while zahl:
        x += zahl % 10
        zahl = zahl // 10
    return x
def one_digit(zahl:int) -> int:
    if zahl > 9:
        one_digit(quersumme(zahl))
    else:
        return zahl

test = int(input('>>>'))
print(one_digit(test))
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo und willkommen im Forum!

Eine Funktion gibt automatisch ``None`` zurück, wenn kein Rückgabewert angegeben wird. Schau dir also mal an, was ``one_digit`` zurückgibt (bzw. was es in einem Fall nicht zurückgibt).
Das Leben ist wie ein Tennisball.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Wenn die Zahl größer als 9 ist rufst du eine weitere Funktion auf, gibst aber nichts zurück.

Abgesehen davon wird der Code meiner Meinung nach trotzdem nicht funktionieren.

Hier mal eine Implementierung aus dem Mottenkeller meiner Festplatte.

Code: Alles auswählen

def sum_up(value):
    value = str(value)
    while len(value) > 1:
        value = str(sum(int(digit) for digit in value))
    return value
capawe
User
Beiträge: 4
Registriert: Montag 11. November 2013, 17:11

Eine Funktion gibt automatisch ``None`` zurück, wenn kein Rückgabewert angegeben wird. Schau dir also mal an, was ``one_digit`` zurückgibt (bzw. was es in einem Fall nicht zurückgibt).
Danke, habs entdeckt und jetzt läuft es auch.

@/me:
ich wollte es eben ohne den "cast" oder wie auch immer in einen string machen.
aber wieso sollte der code denn nicht funktionieren?
BlackJack

@capawe: Selbst wenn man die Umwandlung in eine Zeichenkette vermeiden will (warum eigentlich?) ist zumindest für eine Python-Lösung eine rein iterative Lösung wohl vorzuziehen. Rekursion ist „teuer” und nicht unbegrenzt machbar. Das sollte man nicht ohne Not machen. Für's Informatikstudium mag Rekursion allerdings schick sein.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

capawe hat geschrieben:aber wieso sollte der code denn nicht funktionieren?
OK, ich habe die Verschachtelung mit zwei Funktionen übersehen.

Deine Variante ist allerdings langsam und liefert bei sehr großen Zahlen: "RuntimeError: maximum recursion depth exceeded in comparison".
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

/me hat geschrieben:... liefert bei sehr großen Zahlen: "RuntimeError: maximum recursion depth exceeded in comparison".
Ich weiß ja nicht wie groß dein Speicher ist, aber meiner ist nicht groß genug um Zahlen zu speichern, welche den Ansatz auch nur in die Nähe des üblichen Rekursionslimits bringen.
Das Leben ist wie ein Tennisball.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

EyDu hat geschrieben:
/me hat geschrieben:... liefert bei sehr großen Zahlen: "RuntimeError: maximum recursion depth exceeded in comparison".
Ich weiß ja nicht wie groß dein Speicher ist, aber meiner ist nicht groß genug um Zahlen zu speichern, welche den Ansatz auch nur in die Nähe des üblichen Rekursionslimits bringen.
Es müssen schon seeeehr große Zahlen sein ... oder ein kleines Rekursionslimit. :D
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Naja, das lässt sich ja leicht abschätzen. Für eine s-stellige Quersumme benötigt man n Stellen:

Code: Alles auswählen

n >= (10^s-1)/9 > 10^(s-2)
Für 2-stellige Zahlen also mindestenss 10 Stellen.
Für die 10-stellige Zahl dann 10^8 Stellen.
Für die 10^8-stellige Zahl dann etwa 10^10^8 Stellen.

Naja, man sieht worauf es hinausläuft ;-) Seeeehr groß ist also noch sehr untertrieben und das kleine Rekursionslimit muss wirklich sehr klein sein. Oder man hatte vorher schon genug Funktionsaufrufe :D
Das Leben ist wie ein Tennisball.
Antworten