Seite 1 von 1

einstellige quersumme berechnen

Verfasst: Montag 11. November 2013, 17:21
von capawe
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))

Re: einstellige quersumme berechnen

Verfasst: Montag 11. November 2013, 17:29
von EyDu
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).

Re: einstellige quersumme berechnen

Verfasst: Montag 11. November 2013, 17:30
von /me
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

Re: einstellige quersumme berechnen

Verfasst: Montag 11. November 2013, 17:47
von capawe
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?

Re: einstellige quersumme berechnen

Verfasst: Montag 11. November 2013, 17:55
von 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.

Re: einstellige quersumme berechnen

Verfasst: Montag 11. November 2013, 17:56
von /me
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".

Re: einstellige quersumme berechnen

Verfasst: Montag 11. November 2013, 19:16
von EyDu
/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.

Re: einstellige quersumme berechnen

Verfasst: Montag 11. November 2013, 19:20
von /me
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

Re: einstellige quersumme berechnen

Verfasst: Montag 11. November 2013, 19:40
von EyDu
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