

def facto(n):

    #Cas de base
    if n == 0 :
        return 1

    #Cas général (récursive)
    return n*facto(n-1)



##Exercice 1.1

def exponaive(x,n) :

    #Cas de base
    if n == 0 :
        return 1

    if  n == 1 :
        return x

    #Cas général
    return exponaive(x, n-1)*x

##Exercice 1.2

def exporapide(x,n) :

    #Cas de base
    if n == 0 :
        return 1

    if  n == 1 :
        return x

    #Cas général
    q = n//2
    y = x*x
    if n%2 == 0 :
        return exporapide(y, q)
    else :
        return exporapide(y, q)*x

##Exercice 2


def rechdicho(t, a, b, x) :

    if a <= b :
        m = (a+b)//2

        if x < t[m] :
            return rechdicho(t, a, m-1, x)
        if x > t[m] :
            return rechdicho(t, m+1, b, x)
        if x == t[m] :
            return m

    return None #Facultatif (None signifie que la fonction ne renvoie rien)

def rechdichoprinc(t, x) :

    a = 0
    b = len(t)-1
    return  rechdicho(t, a, b, x)



def rechdichoite(t,x):

    a = 0
    b = len(t) - 1

    while  a <= b :
        m = (a+b)//2

        if x < t[m] :
            b = m-1

        if x > t[m] :
            a = m +1

        if x == t[m] :
            return m

    return None


##Exercice 3
chaine = "chien"
print(chaine[0])
print(chaine[-1])
print(len(chaine))

##Exercice 4
def comptage(c, d) :
    compteur = 0

    for i in range(len(c)) :
        if c[i] == d :
            compteur = compteur + 1
    return compteur

#Variante
def comptage(c, d) :
    compteur = 0

    for x in c :
        if x == d :
            compteur += 1
    return compteur












