2017-01-09 7 views
-1

https://www.youtube.com/watch?v=kC6YObu61_wGlückliche Nummer Funktion wird nicht wahr zurück

Nachdem das verknüpfte Video „7 und Happy Numbers“ beobachtete, beschloss ich, ein Stück Code zu schreiben, um zu prüfen, ob die gegebene Zahl eine glückliche Zahl ist.

c = [] 
num = int(input("What number would you like to check? ")) 
def happyNum(n): 
    newNum = 0 
    c = [] 
    a = str(n) 
    for b in a: 
     c.append(int(b)) 
    for d in c: 
     newNum = newNum + d**2 
    if newNum <= 1: 
     return True 
    elif newNum == 145: 
     return False 
    elif newNum == 113: 
     return False 
    elif newNum == 130: 
     return False 
    else: 
     happyNum(newNum) 
if happyNum(num) == True: 
    print("You've found yourself a happy number!") 
elif happyNum(num) == False: 
    print("Not a happy number I'm afraid!") 

Getestet habe ich es mit 7, die ich wusste, von dem Video eine Glückszahl ist, und festgestellt, dass nichts gedruckt wurde. Ich habe ein paar Tests gemacht, und die Funktion funktioniert gut. Sobald es 1 erreicht, tritt es in die if-Anweisung ein. Das einzige Problem ist, dass es nie True zurückgibt. Warum passiert das und wie kann ich das beheben? Falls dies möglicherweise von Bedeutung ist, ist die Funktion rekursiv.

+2

Sie vermissen eine Rückkehranweisung 'return happyNum (newNum)' in der Funktion 'happyNum' – user2718281

+0

Wohin soll das gehen? – Freguin

+0

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

Antwort

0

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!

Verwandte Themen