# SPDX-License-Identifier: MIT
def factorial(n):
    if n <= 1:
        return 1
    return n * factorial(n - 1)

def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n - 1) + fibonacci(n - 2)

def even(n):
    if n == 0:
        return True
    return odd(n - 1)

def odd(n):
    if n == 0:
        return False
    return even(n - 1)

print(factorial(30))
print(fibonacci(12), even(8), odd(8), even(9))

def risky(n):
    if n == 0:
        return 1 // n
    try:
        return n + risky(n - 1)
    finally:
        print("unwind", n)

try:
    print(risky(3))
except ZeroDivisionError as error:
    print(type(error).__name__)

print(factorial(5))

def rethrow(n):
    if n < 0:
        return 0
    if n == 0:
        raise
    return rethrow(n - 1)

def handled(n):
    if n == 0:
        return 0
    try:
        raise KeyError("inner")
    except KeyError:
        return handled(n - 1)

try:
    try:
        raise ValueError("outer")
    except ValueError:
        print(handled(3))
        rethrow(2)
except ValueError as error:
    print("restored", str(error))

try:
    rethrow(0)
except RuntimeError:
    print("no lingering exception")
