"""
Sujet : Implémentation de la suite récurrente en Python

On considère la suite définie par la relation de récurrence :

    u_(n+3) = 2 * u_(n+2) + u_(n+1) - 2 * u_n

avec les conditions initiales :
    u_0 = 1, u_1 = 2, u_2 = 3.

Travail demandé :
1. Calculer à la main les valaurs de u_3, u_4 et u_5.
2. Écrire une fonction `calcul_u_n(n)` qui calcule le terme u_n de manière itérative.
3. Écrire une fonction `calcul_u_n_rec(n)` qui calcule le terme u_n de manière récursive.
4. Tester ces fonctions pour plusieurs valeurs de n et comparer les résultats. Vérifier à la main la cohérence des résultats.
5. Ecrire une fonction 'calcul_u_n_liste(n)' qui renvoie une liste contenant les n premiers termes de la suite.
"""

def calcul_u_n(n):
    """Calcule u_n de manière itérative."""
    if n == 0:
        return 1
    elif n == 1:
        return 2
    elif n == 2:
        return 3

    u0, u1, u2 = 1, 2, 3
    for k in range(3, n + 1):
        u3 = 2 * u2 + u1 - 2 * u0
        u0, u1, u2 = u1, u2, u3

    return u3

def calcul_u_n_rec(n):
    """Calcule u_n de manière récursive."""
    if n == 0:
        return 1
    elif n == 1:
        return 2
    elif n == 2:
        return 3
    return 2 * calcul_u_n_rec(n - 1) + calcul_u_n_rec(n - 2) - 2 * calcul_u_n_rec(n - 3)


def calcul_u_n_liste(n):
    """Calcule les termes de la suite jusqu'à u_n sous forme de liste."""
    u_n0, u_n1, u_n2 = 1, 2, 3
    u_n3 = 2*u_n2 + u_n1 - 2*u_n0
    resultat = [u_n0,u_n1,u_n2]
    for i in range(n-2):
        resultat.append(u_n3)
        u_n0=u_n1
        u_n1=u_n2
        u_n2=u_n3
        u_n3 = 2*u_n2 + u_n1 - 2*u_n0
    return resultat

def calcul_u_n_liste_bis(n):
    """Calcule les termes de la suite jusqu'à u_n sous forme de liste."""
    u_n0, u_n1, u_n2 = 1, 2, 3
    resultat = [1, 2, 3]
    for i in range(n - 2):
        u_n3 = 2 * u_n2 + u_n1 - 2 * u_n0
        resultat.append(u_n3)
        u_n0, u_n1, u_n2 = u_n1, u_n2, u_n3
    return resultat

# Test des fonctions
for i in range(10):
    print(f"u_{i} (itératif) = {calcul_u_n(i)} | u_{i} (récursif) = {calcul_u_n_rec(i)}")

print("\n","*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*°*","\n")

print("Calcul des 10 premiers termes : ",calcul_u_n_liste(9))
