# Wyznaczanie n-tego wyrazu ciągu zadanego rekurencyjnie:
# (i)  a(0) = 1
# (ii) a(n) = 2 * a(n - 1) + 1, dla n > 0

# Sposób rekurencyjny "z definicji"
def a(n):
    if n == 0:
        return 1
    return 2 * a(n - 1) + 1


# Inny sposób  - iteracyjny, wyliczając wyrazy "po kolei"
def a_iter(n):
    a = 1
    for _ in range(n):
        a = 2 * a + 1
    return a

def a_formula(n):
    return 2 ** (n + 1) - 1


# Szybie porównanie
for i in range(10):
    print(a(i), a_iter(i), a_formula(i))
