Issuu on Google+

LI-101-FOAD / CNED / UPMC 2012-2013

LI101 Programmation récursive

SUJETS DES DEVOIRS À RENVOYER

UPMC Année universitaire 2012-2013

© 2012 Equipe enseignante LI101/UPMC


LI-101-FOAD / CNED / UPMC 2012-2013

Directives

Devoirs à renvoyer à la correction LES DEVOIRS Les sujets de devoirs sont fournis à la fin de ce fascicule. Il y a 3 devoirs à rendre : • Devoir 1 : à rendre le mardi 4 décembre 2012 au plus tard. • Devoir 2 : à rendre le mardi 12 février 2013 au plus tard. • Devoir 3 : à rendre le mardi 2 avril 2013 au plus tard. Pour rendre un devoir, vous devrez le renvoyer, au plus tard à la date mentionnée plus haut. Votre devoir sera corrigé et noté, et il vous sera renvoyé avec un corrigé type. Les devoirs rendus après la date requise seront corrigés mais leur note ne sera donnée qu’à titre indicatif (et ne comptera donc pas dans la note de contrôle continu). Les corrigés des devoirs seront disponibles sur le site web, une dizaine de jours après la date de rendu. Les devoirs porteront toujours sur les séances de travail correspondantes (voir tableau plus loin).

QUESTIONS Pour toute question sur ces devoirs, utilisez en priorité le forum et sa rubrique LI101.

Septembre 2012

-1-


LI101 FOAD - CNED 2012-2013

Devoirs à renvoyer

Devoir n°1 - Enseignement LI 101 FOAD - CNED Exercice 1 : Eléments de langage Scheme - LI 101 Cet exercice a pour objectif de vérifier votre maîtrise des éléments et des types simples du langage Scheme propre au cours LI101. Rappel : pour toutes les questions, les seules fonctions autorisées sont celles de la carte de référence. Question 1.1 - pour chacune des expressions Scheme suivantes indiquer son type et sa valeur de retour. 1. 2. 3. 4. 5.

(= 42 (+ 2 (* 8 (- 8 3)))) (or (= 3 3) (equal? "3" 3)) (and (= 3 3) (equal? "3" 3)) (or (/ 8 4) (/ 4 0)) (and (/ 8 4) (/ 4 0))

Question 1.2 - écrire un ensemble de fonctions pour manipuler les valeurs booléennes usuelles à partir des définitions suivantes : 1. a => b est égal à ((non a) ou b) 2. a <=> b est égal à (a => b) et (b => a) 3. écrire une fonction qui prend 2 booléens a et b en arguments et qui vérifie l’expression (a => b) <=> ((non b) => (non a))

Exercice 2 : Calculs et fonctions simples Question 2.1 - donner une définition complète de la fonction (degres-vers-radians d) qui convertit la valeur d'un angle exprimé en degrés en radians. Scheme définit la constante pi qui vaut 3.14159... Par exemple : (degres-vers-radians 180) --> 3.141592 (degres-vers-radians 360) --> 6.283185 (degres-vers-radians 45) --> 0.785398 Question 2.2 - En utilisant le schéma de Hörner pour représenter un polynôme de la forme p(x) = a x^2 + b x + c, proposer une fonction (polynome x a b c) pour calculer la valeur d’un polynôme au point x, connaissant les coefficients a, b et c. Que conclure sur l’efficacité de cette écriture du point de vue du nombre d’opérations réalisées ? (polynome 5 1 2 3) --> 38 (polynome 2.5 10.5 2.33 3.14) --> 74.58999999999999 (polynome 10 2 5 0.3) --> 250.3 Question 2.3 - proposer une définition complète et récursive de la fonction (epargne m t d) qui étant donné un montant initial m, un taux t (exprimé entre 0 et 1) et une durée d (exprimée en nombre d’années) retourne le nouveau montant de l’épargne. (epargne 100 0.05 0) --> 100 (epargne 100 0.05 1) --> 105 (epargne 1265 0.1 5) --> 2037.2951500000006 Copyright 2012 by UPMC / CNED / LI101 / FOAD


LI101 FOAD - CNED 2012-2013

Devoirs à renvoyer

Question 2.4 - proposer maintenant la fonction récursive (epargne-vir m v t d) qui reprend le principe de la fonction précédente et ajoute un versement annuel d’un montant v. (epargne-vir 100 15 0.05 0) --> 100 (epargne-vir 100 15 0.05 1) --> 120 (epargne-vir 1265 200 0.1 5) --> 3258.3151500000004

Exercice 3 : Fonctions plus complexes Q u e s t i o n 3 . 1 : d o n n e r u n e d é fi n i t i o n c o m p l è t e e t r é c u r s i v e d e l a f o n c t i o n (sommeDesMultiplesDe3 n) qui, étant donné un entier n rend la somme des n premiers multiples de 3. Par exemple : (sommeDesMultiplesDe3 1) --> 3 (sommeDesMultiplesDe3 2) --> 9 (sommeDesMultiplesDe3 10) --> 165 Question 3.2 : donner une définition complète de la fonction (sommeDesMultiples n m) qui, étant donné un entier n et un entier m rend la somme des n premiers multiples de m. Par exemple : (sommeDesMultiples 10 3) --> 165 (sommeDesMultiples 3 10) --> 39 (sommeDesMultiples 7 15) --> 168 Question 3.3 : écrire une définition complète de la fonction (sommeDesMultiplesDe3Bis n) qui réutilise la fonction (sommedesMultiples n m). Question 3.4 : on considère désormais la suite réelle définie de la manière suivante : u0 = C 0 u n = n2 + C ⇥ un

1



où C  0 et C  sont des constantes fixées initialement et n  est un entier naturel. Écrire la définition complète de la fonction (terme-u n c0 c) qui renvoie la valeur du n-ième terme de la suite u pour C  0 = c0 et C  = c . Par exemple : (terme-u 3 1.5 0) --> 9 (terme-u 2 3.2 1) --> 8.2 (terme-u 0 2.89 7.42) --> 2.89

Copyright 2012 by UPMC / CNED / LI101 / FOAD


LI101 FOAD - CNED 2012-2013

Devoirs à renvoyer

Devoir n°2 - Enseignement LI 101 FOAD - CNED Exercice 1 : Listes Question 1.1 - Écrire la définition complète et récursive de la fonction (listeRacines n) qui, étant donné un entier n construit la liste des racines carrées des n premiers entiers strictement positifs. Par simplificité, les racines pourront être données dans l'ordre décroissant. (listeRacines 4) --> (2 1.7320508075688772 1.4142135623730951 1) Question 1.2 - Écrire la définition complète et récursive de la fonction (listeRacinesPos L) qui, étant donnée une liste L de nombres réels, rend la liste des racines carrées des nombres positifs contenus dans la liste L. La liste retournée peut donc être plus petite que l’originale. Ainsi : ! (listeRacinesPos (list -4 81 -25 -16 49 9)) --> (9 7 3) (listeRacinesPos (list -4 -81 -25)) --> () Question 1.3 - Écrire la définition de la fonction (les-n-premiers n L) qui, étant donné un entier naturel n et une liste L, rend la liste des n premiers éléments de la liste L. Par hypothèse, n est considéré comme étant toujours inférieur ou égal au nombre d'éléments de L. La fonction rendra la liste vide si n est égal à 0. Ainsi : (les-n-premiers 4 (list 0 60 14 20 5 132 42)) --> (0 60 14 20)

Exercice 2 : Tri à bulles On se propose d'écrire des fonctions pour trier une liste de nombres. Le tri utilisé est un des plus simples qui existe en informatique : le tri à bulles. Dans tout cet exercice, on ne considérera que des listes de nombres. Question 2.1 - Écrire la définition complète et récursive de la fonction (croissante? L) qui, étant donné une liste de nombres L rend #t si la liste est ordonnée de façon croissante au sens large. Une liste vide ou avec un seul élément est une liste croissante. Par exemple : (croissante? '(1 (croissante? '(1

2 2

7 12 12 9

12 33)) --> #t 33)) --> #f

Question 2.2 - Si une liste n'est pas croissante, il existe donc au moins une valeur dans cette liste qui est plus grande que la valeur qui la suit directement. Écrire la définition complète et récursive de la fonction (corrigeSimple L) qui, étant donné une liste de nombres L rend la liste obtenue en corrigeant les 2 premières valeurs qui sont mal ordonnées dans la liste. On ne corrigera que ces deux premières valeurs. Par exemple : (corrigeSimple '(1 (corrigeSimple '(1 (corrigeSimple '(1

2 2 2

7 12 12 9 10 12

12 33)) --> (1 2 7 33)) --> (1 2 9 12 9 33)) --> (1 2 10

Copyright 2012 by UPMC / CNED / LI101 / FOAD

12 12 33) 33) 9 12 33)


LI101 FOAD - CNED 2012-2013

Devoirs à renvoyer

Question 2.3 - L’idée du tri à bulle récursif proposé dans cet exercice est le suivant : si la liste L est croissante, alors le tri est terminé, on peut rendre la liste telle quelle. Sinon, on corrige cette liste une première fois en inversant les deux premières valeurs erronées, et on applique de nouveau le tri à bulle récursivement pour obtenir à terme la liste corrigée. Écrire la définition complète et récursive de la fonction (tri-bulle L) qui trie les valeurs de la liste L suivant cette méthode. (tri-bulle '(1 (tri-bulle '(1 (tri-bulle '(1

2 2 2

7 12 12 9 10 12

12 33)) --> (1 2 7 12 12 33) 33)) --> (1 2 9 12 33) 9 33)) --> (1 2 9 10 12 33)

Exercice 3 : Fonctionnelles On connaît la fonctionnelle map, on souhaite maintenant écrire une nouvelle fonctionnelle, map2, qui, étant donné une fonction f d'arité 2, et deux listes L1 et L2, rend la liste obtenue en appliquant f aux éléments de L1 et de L2 pris position par position. Cette fonctionnelle possède la signature suivante : ;;; map2: (alpha*beta->gamma)* Liste[alpha]*Liste[beta] -> Liste[gamma] + #f ;;; (map2 f L1 L2) rend la liste obtenue en appliquant f aux paires d'éléments de L1 et L2 correspondants ou #f lorsque les deux listes n'ont pas le même nombre d'éléments. Par exemple, on aura les résultats d'utilisation suivants : (map2 (map2 (map2 (map2

+ + / +

'() '(1 '(9 '(9

'()) --> () 2 3) '(0 5 3)) --> (1 7 6) 2 12) '(3 2 4)) --> (3 1 3) 2) '(3 2 4)) --> #f

Question 3.1 - Donner une définition récursive de la fonctionnelle map2. Question 3.2 - Définir une fonction vérifiant l'égalité de deux listes en utilisant la fonctionnelle map2.

Cet exercice est un peu plus compliqué que les précédents car il mobilise plusieurs notions. Voici donc quelques points sur lesquels orienter votre réflexion : ✦ La fonctionnelle map2 est un semi-prédicat qui renvoie soit une liste, soit la valeur #f ✦ La forme spéciale let permet de récupérer le résultat d’un appel récursif sur la suite de la liste et de réutiliser ce résultat ensuite, par exemple, pour différencier un traitement en fonction de la valeur retournée.

Copyright 2012 by UPMC / CNED / LI101 / FOAD


Enseignement LI101

LI101 FOAD - CNED 2012-2013 – page 1/3

Devoir no3 – Enseignements LI-101 FOAD - CNED

Exercice 1

– Parcours d’arbre binaire (Extrait de l’examen de Juin 2012)

Pour cet exercice, on considère donné l’arbre binaire (ab1) (voir la Figure 1).

F IGURE 1 – Resultat de (ab-draw (ab1)) 1. Écrire la définition complète de la fonction ab-nb-feuilles, d’arité 1, qui prend en argument un arbre binaire A et qui rend le nombre de feuilles que A possède. La fonction rend donc 0 si A est l’arbre vide. Par exemple, (ab-nb-feuilles (ab-nb-feuilles (ab-nb-feuilles (ab-nb-feuilles

(ab-vide)) -> 0 (ab-noeud 1 (ab-vide) (ab-vide))) -> 1 (ab-noeud 1 (ab-vide) (ab-noeud 2 (ab-vide) (ab-vide)))) -> 1 (ab1)) -> 8

2. Écrire la définition complète de la fonction ab-somme, d’arité 1, qui prend en argument un arbre binaire A et qui rend la somme des valeurs de ses étiquettes. La fonction rend donc 0 si A est l’arbre vide. Par hypothèse, on considèrera que toutes les étiquettes de A sont des nombres. Par exemple, (ab-somme (ab-somme (ab-somme (ab-somme

(ab-vide)) -> 0 (ab-noeud 1 (ab-vide) (ab-vide))) -> 1 (ab-noeud 1 (ab-vide) (ab-noeud 2 (ab-vide) (ab-vide)))) -> 3 (ab1)) -> 184

3. Pour un arbre binaire donné, on souhaite maintenant calculer à la fois son nombre de feuilles ainsi que la somme des valeurs de ses étiquettes. Une première idée de fonction réalisant cela pourrait être :

c 2012-2013 (by UPMC / CNED / LI101 / FOAD)


Enseignement LI101

LI101 FOAD - CNED 2012-2013 – page 2/3

;;; ab-nb-et-somme-BAD: ArbreBinaire[Nombre] -> Couple[Nat Nombre] (define (ab-nb-somme-BAD A) (list (ab-nb-feuilles A) (ab-somme A)))

qui donne donc : (ab-nb-somme-BAD (ab-nb-somme-BAD (ab-nb-somme-BAD (ab-nb-somme-BAD

(ab-vide)) -> (0 0) (ab-noeud 1 (ab-vide)(ab-vide))) -> (1 1) (ab-noeud 1 (ab-vide)(ab-noeud 2 (ab-vide)(ab-vide))))->(1 3) (ab1)) -> (8 184)

Cette fonction a un inconvénient majeur : l’arbre A est parcouru 2 fois. Une fois pour calculer le nombre de feuilles (par la fonction ab-nb-feuilles) et une deuxième pour faire la somme des étiquettes (par la fonction ab-somme). Une solution plus efficace pour réaliser ces calculs est de ne parcourir l’arbre qu’une seule fois et de faire les 2 calculs demandés en même temps. Écrire la définition complète de la fonction ab-nb-somme, d’arité 1, qui prend en argument un arbre binaire A et qui rend le couple constitué par le nombre de feuilles de A et par la somme des étiquettes de A. La fonction ne doit visiter un nœud de l’arbre qu’une et une seule fois. La fonction rend donc (0 0) si A est l’arbre vide. Par hypothèse, on considèrera que toutes les étiquettes de A sont des nombres. Par exemple, (ab-nb-somme (ab-nb-somme (ab-nb-somme (ab-nb-somme

(ab-vide)) -> (0 0) (ab-noeud 1 (ab-vide) (ab-vide))) -> (1 1) (ab-noeud 1 (ab-vide)(ab-noeud 2 (ab-vide)(ab-vide)))) -> (1 3) (ab1)) -> (8 184)

Exercice 2 Dans cet exercice, on souhaite mettre en place un petit évaluateur d’expressions booléennes capable de reconnaître et d’évaluer des expressions contenant seulement les connecteurs booléens et, ou, non. La valeur vraie sera notée v, et la valeur faux sera notée f. Les expressions à évaluer, dont le type sera noté ExprBoolPrefixe, seront données soit sous la forme d’une liste préfixe, soit sous la forme d’une valeur v ou f. Par exemple, voilà 4 exemples de formules : v (et (ou v f) (non f)) (non (et (ou v f) (et v v))) (non (non v)) Pour réaliser cet évaluateur, nous allons procéder en 2 étapes : étape 1 : transformation de l’expression (qui est donnée sous la forme d’une liste préfixe) en un arbre général la représentant. Le type de cet arbre est noté ArbreGenBool ; étape 2 : réalisation d’un parcours préfixe de l’arbre général obtenu lors de l’étape 1 pour évaluer le résultat de l’expression. Dans cet exercice, on fait l’hypothèse que les ExprBoolPrefixe à traiter sont toujours bien formées et correspondent bien à une expression booléenne correcte.

c 2012-2013 (by UPMC / CNED / LI101 / FOAD)


Enseignement LI101

LI101 FOAD - CNED 2012-2013 – page 3/3

1. Écrire la définition complète de la fonction expr->agb qui, pour une ExprBoolPrefixe E donnée, représentant une expression bien formée, rend l’ArbreGenBool représentant cette liste E. Par exemple : (expr->agb ’v) rend l’arbre représenté par (ag-noeud ’v (list)) (expr->agb ’(et (ou v f) (non f))) rend l’arbre représenté par (ag-noeud ’et (list (ag-noeud ’ou (list (ag-noeud ’v (list)) (ag-noeud ’f (list)))) (ag-noeud ’non (list (ag-noeud ’f (list))))))

(expr->agb ’(non (et (ou v f) (et v v)))) rend l’arbre représenté par (ag-noeud ’non (list (ag-noeud ’et (list (ag-noeud ’ou (list (ag-noeud ’v (list)) (ag-noeud ’f (list)))) (ag-noeud ’et (list (ag-noeud ’v (list)) (ag-noeud ’v (list))))))))

(expr->agb ’(non (non v))) rend l’arbre représenté par -> (ag-noeud ’non (list (ag-noeud ’non (list (ag-noeud ’v (list))))))

2. Écrire la définition complète de la fonction evalue-agb qui, pour un ArbreGenBool AGB donné, représentant une expression bien formée, rend la valeur booléenne (#t ou #f) correspondant à l’évaluation de cette expression. Par exemple : (evalue-agb (evalue-agb (evalue-agb (evalue-agb

(expr->agb (expr->agb (expr->agb (expr->agb

’v)) -> #t ’(et (ou v f) (non f)))) -> #t ’(non (et (ou v f) (et v v))))) -> #f ’(non (non v)))) -> #t

3. Écrire la définition complète de la fonction evalue-exprbool qui, pour une ExprBoolPrefixe E donnée, représentant une expression bien formée, rend la valeur booléenne (#t ou #f) correspondant à l’évaluation de cette expression. Par exemple : (evalue-exprbool ’v) -> #t (evalue-exprbool ’(et (ou v f) (non f))) -> #t (evalue-exprbool ’(non (et (ou v f) (et v v)))) -> #f

c 2012-2013 (by UPMC / CNED / LI101 / FOAD)


devoirs-2012