Das Video ist in seiner Beschreibung der glücklichen Zahlen unvollständig. Zahlen, die glücklich sind, werden bei 1 enden, aber sie sagen nicht, was mit unglücklichen Zahlen passiert. Wenn sie unglücklich sind, werden sie irgendwann eine Reihe von Zahlen durchlaufen. Um festzustellen, ob sie unglücklich sind, müssen Sie die produzierten Zahlen verfolgen und sehen, ob Sie Wiederholungen erhalten. (Vermutlich, was Sie hatten c = []
für, aber am Ende nicht verwendet.) Dies bedeutet, dass Sie eine wachsende Menge in Ihren rekursiven Aufrufe weitergeben müssen. Die Nummern 145, 113 und 130 sind im Allgemeinen nicht nützlich und sollten nicht in Ihrem Code enthalten sein.
Hier ist eine Nacharbeit, die die obigen Fragen behandelt:
def is_happy(number, seen=None):
if number == 1: # it's happy
return True
if seen is None:
seen = set()
if number in seen: # a cycle, it's unhappy
return False
seen.add(number)
# separate the digits into a list; several ways to do this
digits = [ord(digit) - ord('0') for digit in str(number)]
number = 0 # we can reuse number as we got what we needed
for digit in digits:
number += digit ** 2
return is_happy(number, seen) # this could have also been a loop
number = int(input("What number would you like to check? "))
if is_happy(number):
print("You've found yourself a happy number!")
else:
print("Not a happy number I'm afraid!")
Aber, wenn wir eine glückliche Zahl, dann alle Zahlen, die wir überprüft in den Prozess der determing, dass sie glücklich ist, sind selbst glücklich zu finden. Dito für unglückliche Zahlen. Also, wenn wir einige Caching hinzufügen, gefährliche Standardwerten, die bis zur nachfolgenden Anruf tragen:
def is_happy(number, seen=None, happy=set([1]), unhappy=set()):
if seen is None:
seen = set()
if number in happy: # it's happy
happy.update(seen) # all seen numbers are happy too
return True
if number in unhappy or number in seen: # a cycle, it's unhappy
unhappy.update(seen) # all seen numbers are unhappy too
return False
seen.add(number)
# separate the digits into a list; several ways to do this
digits = [ord(digit) - ord('0') for digit in str(number)]
number = 0 # we can reuse number as we got what we needed
for digit in digits:
number += digit ** 2
return is_happy(number, seen) # this could have also been a loop
for number in range(1, 1000001):
if is_happy(number):
print(number, end=" ")
print()
können wir das Glück der Zahlen bestimmen, bis zu einer Million in 1/6 der Zeit, als wenn wir nicht gehalten hatten Spur früherer glücklicher und unglücklicher Zahlen!
Sie vermissen eine Rückkehranweisung 'return happyNum (newNum)' in der Funktion 'happyNum' – user2718281
Wohin soll das gehen? – Freguin
in Ihrem 'else' der' happyNum' Funktion. Und übrigens, Sie werden eine Endlosschleife in Ihrer Funktion erhalten, wenn die Eingabe keine glückliche Nummer ist. – user2718281