Trudne początki NOT

0

Witam
Dopiero zaczęłem naukę i podczas przerabiania lekcji trafiłem na coś czego nie mogę zrozumieć.

def is_even(x):
    if x == 0:
        print(x)
        print("koniec")
        return True
    else:
        print("odejmuje")
        return is_odd(x-1)

def is_odd(x):
    print(x)
    return not is_even(x)

print(is_odd(1))
print(is_even(1))

Output:
1
odejmuje
0
0
koniec
True
odejmuje
0
0
koniec
False

Nie mogę zrozumieć dlaczego dla funkcji odd daje True a na even daje False. Mógłby mi ktoś to wytłumaczyć

1

Postaw breakpoint, uruchom pod debugerem i prześledź wykonanie step by step.

0

Dzięki za odpowiedź, lecz aktualnie uczę się na androidzie w aplikacji SoloLearn i tam jest konsola Pythona i nie mam tam możliwości debugowania

Edit. odpaliłem lapka lecz z dalej nie mogę dojść dlaczego tak się dzieje.
Zwłaszcza to że zmienna x pod koniec działania w obu przypadkach wynosi 0

0

Spróbuję.
Ponieważ dla is_odd(1), is_odd jest wykonywane dwa razy (rekurencyjnie)
zatem przy 0 dla którego zwracana jest wartość True będzie zaprzeczone dwa razy jak rekurencja zacznie zwracać wartości

Dla is_even(1), is_odd wykona się tylko raz zatem zaprzeczenie True wywołane zostanie tylko raz.

Zależnie od x wynik będzie określony jako

(not (not (not (not ... (not (not (True))) ... ))))

dla is_even(0) is_odd się nie wykona (True)
dla is_odd(0) is_odd się wykona (not (True) )

Ogólnie kluczowym pojęciem jest pojęcie rekurencji, a "żeby zrozumieć rekurencję trzeba najpierw zrozumieć rekurencję"
https://demotywatory.pl/2525136/Aby-zrozumiec-rekurencje

0

Dzięki już kumam, właśnie jestem w trakcie przerabiania rekurencji lecz w j. angielskim(czytaj dodatkowe utrudnienie)
Zrozumiałem jak mi to wytłumaczyłeś, dzięki

0

Edit. odpaliłem lapka lecz z dalej nie mogę dojść dlaczego tak się dzieje.

Bo nie zrobileś tego o co prosiłem. Odpal jakieś ludzkie środowisko, np. PyCharma, kliknij na pierwszą linijkę kodu, daj "add breakpoint", uruchom program w debug mode (ikonka robaczka) a potem wykonuj program linijka po linijce, analizując stan wszystkich zmiennych.

0

Zawsze zastanawialem sie czy ktos jest na tyle odwazny(?), zeby uczyc sie programowac na komorce. Okazuje sie, ze tak.

Zacznij debugowac kod, a jesli nie potrafisz odwiedz strone pythontutor kropka com, kliknij w "visualize your code", wklej kod i krok po kroku analizuj wykonywanie poszczegolnych statementow i to, jakie wartosci przyjmuje x.

0

Dzięki wszystkim za rady. Obecnie uczę się na komórce w bardzo ciekawej aplikacji, z doskoku laptop.
Po przerobieniu aplikacji przesiadam się na laptop i cisne książkę, pycharm mam. Ale posługiwać się jeszcze debugowaniem zbytnio nie potrafię, obiecuję nadrobić zaległości

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