12.07.2015 Views

Feuille d'exercices n°3 - FIL

Feuille d'exercices n°3 - FIL

Feuille d'exercices n°3 - FIL

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Univ. Lille1 - Licence Informatique 2ème année 2013-2014Algorithmes et Programmation Impérative 2Récursivité1 Exercices1.1 Généralités sur les algorithmes récursifsExercice 2-1 Que calcule fact ?Question 1Voici quelques lignes de code :let fact n = 1let fact n =if n = 0 then1elsen * (fact (n - 1))Quelle est la valeur de fact 10 ? Plus généralement de fact n où n désigne un entier quelconque ?Question 2 Voici maintenant une autre déclaration de la fonction fact :let rec fact n =if n = 0 then1elsen * fact n - 1Que donne le calcule de fact 1 ?Exercice 2-2 Que calculent les fonctions pair et impair ?Voici la déclaration en Caml de deux fonctions :let rec pair n = if n = 0 then true else not (impair n)and impair n = if n = 0 then false else not (pair n)Question 1 Que pensez-vous des expressions calculées par chacune des deux fonctions dans lesdeux cas de base et récursif ?Question 2 Tracez le calcul de l'expression pair 1.Exercice 2-3 Encore la fonction pairVoici la déclaration en Caml de la fonction pair :let rec pair n =if n = 0 then trueelse pair (n - 2)1


Que pensez-vous de cette fonction ?Exercice 2-4 La fonction de Mc CarthyVoici la déclaration en Caml d'une fonction récursive :let rec mccarthy n =if n > 100 then n - 10else mccarthy (mccarthy (n + 11))Question 1 Si n est un entier strictement supérieur à 100, quelle est la valeur de mccarthy n ?Question 2 Et pour 90 ≤ n ≤ 100 ?Question 3 Et pour n ≤ 100 quelconque ?1.2 Algorithmes récursifs sur les nombresExercice 2-5 Somme de deux entiersQuestion 1 Proposez un algorithme récursif de calcul de la somme de deux entiers naturels a et ben supposant que les seules opérations de base dont vous disposez sont l'ajout de 1 à un entier a : a + 1 le retrait de 1 à un entier a : a − 1 et les comparaisons à 0 d'un entier a : a = 0, a > 0 et a < 0.Question 2 Comment étendre cette fonction aux entiers de signe quelconque ?Exercice 2-6 Produit de deux entiersQuestion 1 Proposez un algorithme récursif de calcul du produit de deux entiers naturels a et b ensupposant que les seules opérations de base dont vous disposez sont la somme de deux entiers a et b : a + b le retrait de 1 à un entier a : a − 1 et la comparaison à 0 d'un entier a : a = 0.Exercice 2-7 Puissance entière d'un nombre réelQuestion 1 Proposez un algorithme récursif de calcul de la puissance n-ième (n ∈ N) d'un nombreréel a en supposant que les seules opérations de base dont vous disposez sont le produit de deux réels a et b : a × b le retrait de 1 à un entier a : a − 1 et la comparaison à 0 d'un entier a : a = 0.Exercice 2-8 Algorithme d'EuclideL'algorithme d'Euclide permet de calculer le pgcd de deux nombres entiers, c'estàdire leplus grand entier positif divisant ces deux nombres, par des divisions successives.Voici le déroulement de cet algorithme pour le calcul du pgcd de a = 119 et b = 544119 = 544 × 0 + 119544 = 119 × 4 + 68119 = 68 × 1 + 5168 = 51 × 1 + 1751 = 17 × 3 + 02


Le pgcd de 119 et 544 est le dernier reste non nul, c'estàdire 17.Le pgcd n'est pas déni lorsque les deux nombres sont nuls.Question 1 Exprimez de manière récursive cet algorithme. Vous pourrez supposer que les deuxentiers a et b sont positifs ou nuls, et que l'un au moins de ces deux entiers n'est pas nul.Question 2Codez cet algorithme en Caml en utilisant l'opérateur modulo.Question 3 En sachant qu'en Caml l'expression a mod b a une valeur ayant le même signe que a,quelle est la valeur de l'expression pgcd 119 (-544) ?Question 4 Modiez la programmation de votre fonction pgcd pour que les valeurs qu'elle renvoiesoient toujours positives.Exercice 2-9 Coecient binomial( n n!Les coecients binomiaux sont dénis pour les entiers naturels n ≥ p ≥ 0 par =p)p!(n − p)! .Une relation de récurrence valable pour n > p > 0 est( ) ( ( )n + 1 n n= +p + 1 p)p + 1Question 1 Réalisez une fonction eectuant un calcul récursif des coecients binomiaux qui n'utiliseque l'addition des entiers.Question 2 Tracez le calcul du coecient binomial pour n = 5 et p = 2.1.3 Algorithmes récursifs sur les chaînes de caractèresExercice 2-10 PalindromesUn palindrome est un mot dont les lettres lues de gauche à droite sont les mêmes que celleslues de droite à gauche. Les mots radar, elle, été, ici sont des palindromes.Question 1 Réalisez un prédicat qui teste si un mot est un palindrome. Pour cela vous pourrezutiliser la fonction String.sub de typestring → int → int → stringqui permet d'extraire une sous-chaîne d'une chaîne (premier paramètre) à partir d'un indice (secondparamètre) et d'une certaine longueur (troisième paramètre).Exercice 2-11 Occurrences dans une chaîneQuestion 1Réalisez une fonction nb_occurrences de typestring → char → intqui renvoie le nombre d'occurrences du caractère (second paramètre) dans la chaîne (premierparamètre).Par exemple# nb_occurrences "abcdebdb" ’z’ ;;- : int = 0# nb_occurrences "abcdebdb" ’b’ ;;- : int = 33


Vous pourrez utiliser avec prot la fonction String.subQuestion 2Réalisez maintenant une fonction indice de typestring → char → int qui renvoie l'indice de la première occurence du caractère (second paramètre) dans la chaîne(premier paramètre) si le caractère est eectivement présent, et qui déclenche une exception Failure "indice caractere non trouve" : dans le cas contraire.Cette fonction indice est une fonction qui fait partie du module String sous le nom index. Unesolution possible pour cette question est donclet indice = String.indexmais ce n'est évidemment pas ce qui est attendu. De plus, lorsque le caractère n'est pas présent dansla chaîne, la fonction String.index déclenche l'exception Not_found.Exercice 2-12Permutations des caractèresDans cette exercice, on appelle permutation d'une chaîne de caractères s toute chaîne demême longueur que s contenant les mêmes caractères que s. Par exemple, la chaîne eadbc estune permutation de la chaîne abcde.Si la chaîne s a tous ses caractères distincts, il existe |s|! permutations de s.On suppose dans la suite que s est une chaîne ayant tous ses caractères distincts. On supposenumérotées de 0 à |s|!−1 les permutations de s rangées dans l'ordre lexicographique. Par exemple,la chaîne eadbc est la permutation numéro 100 de la chaîne abcde.Réalisez un programme qui donne la permutation numéro n d'une chaîne s. (Vous pourrezsupposer que les caractères de la chaîne s sont de gauche à droite dans l'ordre lexicographique. Sice n'est pas le cas, l'ordre lexicographique des permutations sera induit par l'ordre des caractèresdans s.)Exercice 2-13 Évaluation d'expressions arithmétiques simplesDans cet exercice on considère des chaînes de caractères décrivant des sommes de nombresentiers naturels. Ces chaînes ne comprennent que des chires (caractères ’0’, ’1’, . . . , ’9’) etle symboles usuel de l'addition ’+’.Ces chaînes représentent donc soit un entier naturel, soit une somme d'entiers naturels. Onsuppose de plus que cette chaîne est bien formée, c'estàdire qu'elle représente eectivementune somme d'entiers. On s'interdit donc des chaînes de la forme "", "12+", "+12", "12++12", . . .Question 1Réalisez la fonction evalue_somme de typestring → intqui renvoie l'entier égal à la somme représentée par la chaîne passée en paramètre.Par exemple# evalue_somme "123" ;;- : int = 123# evalue_somme "123+15" ;;- : int = 138# evalue_somme "123+15+1" ;;- : int = 139# evalue_somme "123+15+1+2000" ;;- : int = 21394


Vous pourrez utiliser avec prot les fonctions String.sub (cf exercice 10), String.index (cfexercice 11) et int_of_string.1.4 Algorithmes récursifs géométriquesExercice 2-14 Tracer un segmentEn informatique graphique, tous les points ont des coordonnées entières. Soit donc deux pointsA de coordonnées (x A , y A ) et B de coordonnées (x B , y B ). Proposez un algorithme récursif pourtracer à l'écran le segment [A, B]. La commande primitive que vous utiliserez est la commandeplot x y qui dessine le pixel de coordonnées (x, y).1.5 Algorithmes récursifs sur les tableauxExercice 2-15 Somme des éléments d'un tableauDonnez une version récursive du calcul de la somme des éléments d'un tableau d'entiers.Exercice 2-16 InversionDonnez un algorithme récursif de l'inversion de l'ordre des éléments d'un tableau.5

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!