collatz z funkcją daje nieskończonego loopa

0

Hej, jestem nowy i na forum, i w programowaniu - jak na razie sama nauka programowania mega wciąga:) ale mam pewien problem:
jak próbuje rozwiązać problem collatz przy pomocy funkcji to dostaję nieskończonego loopa, bez definiowania funkcji wszystko jest ok - dlaczego?

number = 44   
while number != 1:    
    if number%2 == 0:        
        number = number//2
        print(number)
    else:
        number = 3*number+1
        print(number)

i z funkcją

number = 44
def collatz(number):    
    if number%2 == 0:        
        number = number//2
        return number  
    else:
        number = 3*number+1
        return number    
while number != 1:    
    print(collatz(number))
2

Bo przecież nigdzie nie przypisujesz wyniku funkcji więc non stop wołasz w pętli collatz(44). Weź pod uwagę że zmienne lokalne funkcji nijak się mają do zmiennych poza tą funkcją. W twoim programie masz DWIE OSOBNE zmienne o nazwie number. Jedna zdefiniowana poza funkcją i ta jest przekazywana do funkcji zawsze z wartością 44, a druga jest lokalną zmienną wewnątrz funkcji.

0

@sigg, Oczywiście przemyśl wszystkie powyższe uwagi @Shalom ; ale, przy założeniu, że teza jest spełniona, (odsyłam do wikipedii: https://en.wikipedia.org/wiki/Collatz_conjecture), taki, z palca kod:

# colatz conjecture

def is_even(n):
    return n % 2 == 0


def collatz(n, xs):
    if n == 1:
        return xs
    elif is_even(n):
        xs.append(n)
        return collatz(n // 2, xs)
    else:
        xs.append(n)
        return collatz(3 * n + 1, xs)


print(collatz(666, []))  # nowa płyta Iron Maiden się zbliża :)) -> [666, 333, 1000, ...]

Zauważ, że śledzenie ścieżki ma tutaj znaczenie. Oczywiście, w ten sposób problemu nie rozwiążemy, ale to już inna historia :)

0

dzięki za pomoc, zmieniłem funkcję na taką i działa :) :

def collatz(x):
    global number
    if number%2 == 0:        
        number = x//2
        return number
    else:
        number = 3*x+1
        return number 

number = 44
while number != 1:
    print(collatz(number))
5

@sigg AAAAAAAAAAAAAAAAAAAAAAAAAAA NIE NIE NIE! Zrobiłeś chyba najgorszą rzecz jaką mogłeś zrobić. Dramat. Zapomnij o istnieniu słowa global bo to tylko problemy. Zresztą teraz ten kod w ogóle nie ma sensu, bo twoja funkcja ma argument którego nie używa. Masakra.

Łap i nie grzesz więcej:

def collatz(number):
    if number%2 == 0:        
        number = number//2
        return number
    else:
        number = 3*number+1
        return number 

number = 44
while number != 1:
    number = collatz(number) # funkcja ma return, więc przypisujemy sobie gdzieś wynik który funkcja nam zwróciła...
    print(number)
0

super, dzięki!
dlaczego global jest taki problematyczny?

3

Bo wprowadza nieczytelną akcję na dystans. Nagle zachowanie twojej funkcji nie zależy od tego, jak ją wywołujesz, ale także od wartości jakiejś zmiennej, która może być modyfikowana pięć plików dalej przez coś zupełnie nie powiązanego.

0

kumam, dzięki!

1 użytkowników online, w tym zalogowanych: 0, gości: 1