Up Next
Version pdf - Version archive

1.1  Initiation

1.1.1  Factorielle

On définit la fonction factorielle par récurrence de la façon suivante :



n ! = n.((n−1)!) 
0 ! = 1

Exercice 1

Écrire la fonction factorielle : int -> int qui à n associe n!.

Exercice 2

Écrire la fonction factorielle_acc : int -> int -> int telle que factorielle_acc n k calcule k(n!)

Exercice 3

Écrire une fonction factorielle_bis : int -> int qui invoque factorielle_acc de sorte que factorielle_bis n calcule n!.

1.1.2  Exponentiation lente

L’élévation de b à la puissance n se définit récursivement par itération du produit



bn = b.bn−1 
b0 = 1

Exercice 4

Écrire une fonction slow_exp : int -> int -> int prenant b et n en paramètres en calculant bn à l’aide de la relation de récurrence mentionnée ci-dessus.

Exercice 5

Écrire une fonction recursive terminale slow_exp_acc : int -> int -> int -> int prenant a, b et n en paramètres en calculant a.bn.

Exercice 6

Écrire une fonction slow_exp_bis : int -> int -> int qui invoque slow_exp_acc de sorte que slow_exp_bis b n calcule bn.

1.1.3  Exponentiation rapide

Nous allons calculer bn à l’aide des relations de récurrence suivantes




bn = (bn/2)2si n est pair 
bn = b.bn−1si n est impair 
b0 = 1

Exercice 7

Ecrire une fonction even : int -> bool telle que even n retourne true si et seulement si n est pair.

Exercice 8

Définir la fonction fast_exp : int -> int -> int telle que fast_exp b n calcule bn avec les égalités ci-dessus.

Exercice 9

Prouvez que la fonction fast_exp se termine toujours.

Exercice 10

Donnez une version récursive terminale de fast_exp.

1.1.4  PGCD

On définit le plus grand commun diviseur (greatest common divider) de deux entiers récursivement de la façon suivante :



gcd(nm)= gcd(mn mod m
gcd(n, 0) = n

Exercice 11

Prouvez que cette relation de récurrence permet d’écrire une fonction qui se termine toujours.

Exercice 12

Définir la fonction gcd : int -> int -> int telle que gcd n m calcule le PGCD de n et de m à l’aide des relations ci-dessus.

1.1.5  Caractères et entiers

Exercice 13

Écrire la fonction lettre_suivante : char -> char telle que lettre_suivante a retourne la lettre située après a dans l’alphabet. Nous ne gérerons pas le cas particulier où a = ’z’.

Exercice 14

Écrire la fonction figure_of_int : int -> char telle que figure_of_int n retourne le caractère représentant le chiffre n. Par exemple, figure_of_int 4 retourne ’4’. Nous ne gérerons pas les cas particuliers où n est un nombre de plusieurs chiffres.

Exercice 15

Écrire la fonction compare_lettres : char -> char -> bool telle que compare_lettres a b retourne vrai ssi la lettre a et située avant la lettre b dans l’alphabet ou si les deux lettres sont les mêmes.

Exercice 16

Écrire la fonction alphabet : char -> char -> unit telle que alphabet lettre_depart lettre_arrivee affiche l’alphabet entre les lettres lettre_depart et lettre_arrivee.

1.1.6  Mise sous forme récursive

Exercice 17

Écrire la fonction mult : int -> int -> int telle que mult x y retourne le produit de x par y sans effectuer de multiplication.

Exercice 18

Mettez la fonction précédente sous forme récursive terminale. Encapsulez-là dans une fonction mult_bis : int -> int -> int.

1.1.7  Indicatrice d’Euler

Exercice 19

Écrire une fonction ind_euler : int -> int retournant l’indicatrice d’Euler de l’entier passé en paramètre.


Up Next