Here is is_even() again:
def is_even(n):
if n == 0:
return True
return not is_even(n-1)
Let's trace is_even(5):
0
/|
True |
\ 1
/ |
False\ |
2
/|
True |
\ 3
/|
False |
\ 4
True /|
\ |
5
|
False
Consider a call to is_even(2). To evaluate it, we need to call is_even(1), and then return the opposite of what that returns. is_even(1) returns not is_even(0), which is False. So is_even(2) return not False, i.e., it returns True.