Sunteți pe pagina 1din 3

#/usr/bin/python

# -*- coding: utf-8 -*-

# *** Exercice 1 ***


# Question 1
def liste():
"""Renvoie la liste vide."""
return ()
def vide(l):
"""Teste si la liste l est vide."""
return l == ()
def cons(a, l):
"""Renvoie la liste obtenue en ajoutant l'élément a devant la liste l."""
return (a, l)
def tete(l):
"""Renvoie le premier élément de l."""
t, q = l # (l est un couple, donc on peut le séparer en deux)
return t
def queue(l):
"""Renvoie la liste l � laquelle on enlève le premier élément."""
t, q = l
return q

# Question 2
# On fabrique la liste contenant les éléments de 1 � 6 en partant de
# la liste vide (obtenue par liste()) et en ajoutant un par un les
# éléments � l'aide de la fonction cons
l = cons(1, cons(2, cons(3, cons(4, cons(5, cons(6, liste()))))))

# Question 3
def longueur(l):
"""Donne la longueur de la liste l."""
if vide(l):
return 0
else:
return 1 + longueur(queue(l))
def element(i, l):
"""Donne le i-ème élément de la liste."""
if i == 0:
return tete(l)
else:
return element(i-1, queue(l))
def supprimer(i, l):
"""Renvoie la liste l � laquelle on a enlevé le i-ème élément."""
if i == 0:
return queue(l)
else:
return cons(tete(l), supprimer(i-1, queue(l)))
def ajouter(x, i, l):
"""Ajoute l'élement x en position i dans la liste l."""
if i == 0:
return cons(x, l)
else:
return cons(tete(l), ajouter(x, i-1, queue(l)))

# Question 4
def map(f, l):
"""Applique la fonction f � tous les élements de l."""
if vide(l):
return l
else:
return cons(f(tete(l)), map(f, queue(l)))
def count(x, l):
"""Compte le nombre d'occurrences de x dans l."""
if vide(l):
return 0
else:
if tete(l) == x:
return 1 + count(x, queue(l))
else:
return count(x, queue(l))
def filter(f, l):
"""Renvoie la liste des éléments de l qui pour lesquels la fonction f vaut
True."""
if vide(l):
return l
else:
if f(tete(l)):
return cons(tete(l), filter(f, queue(l)))
else:
return filter(f, queue(l))
def reduce(f, l, x):
"""Si l'on nomme y0, y1, ..., yn les éléments de l, on définit
x0 = x, x1 = f(x0, y0), x2 = f(x1, y1),
et ainsi de suite jusqu'� xn+1 = f(xn, yn).
La fonction doit renvoyer xn+1."""
if vide(l):
return x
else:
return reduce(f, queue(l), f(x, tete(l)))

# *** Exercice 2 ***

MAX = 100
# Question 1
def liste_tab():
"""Créé une liste vide (représentée sous la forme d'un tableau)."""
return[[None]*MAX, 0]
def longueur_tab(l):
"""Renvoie la longueur de la liste l."""
return l[1]
def element_tab(i, l):
"""Renvoie le i-ème élément de la liste l."""
return l[0][i]
def ajouter_tab(x, i, l):
"""Ajoute l'élément x en position i dans la liste l."""
# Rappel :
# l[0] désigne le tableau contenant les valeurs de la liste
# l[1] désigne le nombre d'éléments présents dans la liste
for i in range(l[1]-1, i-1, -1):
l[0][i+1] = l[0][i] # on décale toutes les cases après l'indice i
l[0][i] = x
l[1] += 1
def supprimer_tab(i, l):
"""Supprime l'élément en position i dans la liste l."""
for j in range(i, l[1]-1):
l[0][j] = l[0][j+1]
l[1] -= 1
# Une définition de liste pour tester les fonctions
l_tab = liste_tab()
ajouter_tab(3, 0, l_tab)
ajouter_tab(1, 0, l_tab)
ajouter_tab(2, 1, l_tab)
ajouter_tab(5, 3, l_tab)
ajouter_tab(4, 3, l_tab)

# Question 2
def vide_tab(l):
"""Teste si la liste l est vide."""
return l[1] == 0
def tete_tab(l):
"""Renvoie le premier élément de la liste l."""
return l[0][0]
def queue_tab(l):
"""Renvoie la queue de la liste l."""
q = liste_tab()
for i in range(1, l[1]):
q[i-1] = l[i]
return q
def cons(x, l):
"""Renvoie une copie de la liste l � laquelle on a ajouté
l'élément x en tête."""
l2 = liste_tab()
l2[0][0] = x # on écrit x sur la première case du tableau
for i in range(l[1]):
l2[0][i+1] = l[0][i] # copie les valeurs de l dans l2
l2[1] = l[1] + 1 # l2 a un élément de plus que l
return l2

# Question 3
def map_tab(f, l):
"""Applique la fonction f � tous les éléments de l."""
for i in range(l[1]):
l[0][i] = f(l[0][i])
def count_tab(x, l):
"""Compte le nombre d'occurrences de x dans la liste l."""
c = 0 # nombre de fois que l'élément x a été vu
for i in range(l[1]):
if l[0][i] == x:
c += 1
return c
def filter(f, l):
"""Renvoie une copie de la liste l ne contenant que les éléments
pour lesquels la fonction f vaut True."""
l2 = liste_tab()
for i in range(l[1]):
if f(l[0][i]): # Si le i-ème élément de l vérifie f, on
# l'ajoute � la fin de l2
ajouter_tab(l[0][i], l2[1], l2)
return l2
def reduce_tab(f, l, x):
"""Réduit la liste l selon f."""
for i in range(l[1]):
x = f(x, l[0][i])
return x

S-ar putea să vă placă și