exercices : Écrire et prouver des algorithmes itératifs et récursifs
À chaque fois, on vous demande d'écrire un algorithme puis de le prouver.
Arithmétique
Entier vers décimal
Écrivez (et prouvez) un algorithme de signature base10(entier) -> [entier] rendant la forme décimale (un tableau de chiffres allant de 0 à 9) d'un entier. On doit avoir :
base10(123) = [3, 2, 1]
Étendre
Écrivez (et prouvez) un algorithme de signature étendre([entier], n) -> [entier] qui ajoute n 0 en à la fin du tableau. Par exemple :
étendre([3, 2, 1], 4) = [3, 2, 1, 0, 0, 0, 0]
Décimal vers entier
Écrivez (et prouvez) un algorithme de signature entier([entier]) -> entier rendant la valeur d'un entier écrit en forme décimale. On doit avoir :
entier([3, 2, 1]) = 123
Somme
Écrivez (et prouvez) un algorithme permettant de calculer la somme de 2 nombres donnés sous leur forme décimale (un tableau de chiffres allant de 0 à 9). Cet algorithme devra être de signature : somme([entier], [entier]) -> [entier]
Soustraction
Écrivez un algorithme permettant de calculer la soustraction de 2 nombres donnés sous leur forme décimale (un tableau de chiffres allant de 0 à 9). Cet algorithme devra être de signature : soustraction(n: [entier], m: [entier]) -> [entier] et tel que soustraction(n, m) = base10(|entier(n)-entier(m)|)
Bon parenthésage
Uniquement des parenthèses
Écrivez un algorithme permettant de savoir si une chaîne de caractères uniquement formée des caractères "(" et ")" est un bon parenthésage ou pas. Ainsi :
parenthèses("(())()") = Vraiparenthèses("(())()(") = Faux
Couple de parenthèses
Si s est une chaîne de caractères uniquement formée de parenthèses ouvrante et fermante, écrivez un algorithme de signature couple(s: chaîne, i: entier) -> entier qui rend l'index de la parenthèse associée à celle d'indice i ou -1 si elle n'existe pas (et s n'est pas un bon parenthésage). Par exemple :
parenthèses("(())()", 0) = 3parenthèses("(())()(", 5) = 4parenthèses("()))", 2) = -1
Parenthèses et lettres
Écrivez un algorithme permettant de savoir si une chaîne de caractères uniquement formée des caractères "(" et ")" et des lettres de l'alphabet est un bon parenthésage.
Parenthèses, crochets et lettres
Même question que précédemment mais la chaîne de caractère contient des crochets ouvrants ("[") et fermants ("]") en plus des lettres de l'alphabet et des parenthèses ouvrantes et fermantes.
Vous pourrez créer un algorithme récursif qui utilise le fait que si les chaînes s1 et s2 sont des parenthésages corrects alors :
- la chaîne
s1 + s2est un parenthésage correct. - la chaîne
s = "(" + s1 + ")" + s3est un parenthésage correct. - la chaîne
s = "[" + s1 + "]" + s3est un parenthésage correct.
Polynômes
Valeur
écrivez une fonction valeur telle que
-
paramètres d'entrée :
- une liste de $n+1$ réels $[a_0, \dots, a_n]$ $n \geq 0$
- un réel $x$
-
sortie :
- $\sum_{i=0}^na_i x^i$
On pourra supposer que la fonction puissance $x^n$ existe pour tout réel $x$ et tout entier positif $n$.
Somme
Écrivez une fonction somme telle que
-
paramètres d'entrée :
- une liste de réels $[a_0, \dots, a_n]$
- une liste de réels $[b_0, \dots, b_m]$
-
sortie :
- $[a_0 + b_0, \dots, a_n+b_n]$ si $n = m$
- $[a_0 + b_0, \dots, a_n+b_n, b_{n+1}, \dots, b_m]$ si $n < m$
- $[a_0 + b_0, \dots, a_m+b_m, a_{m+1}, \dots, a_n]$ si $m < n$
Produit
Écrivez une fonction produit telle que
- paramètres d'entrée :
- une liste de réels $[a_0, \dots, a_n]$
- une liste de réels $[b_0, \dots, b_m]$
- sortie (on suppose):
- une liste $[c_0, \dots, c_{m+n}]$ telle que $c_k = \sum_{i+j=k}a_ib_j$ pour tout $0\leq k \leq m+n$