Vous êtes sur la page 1sur 4

Devoir maison 1 - Corrigé

M2 AIGEME, année 2008-2009

Exercice 1
1. On souhaite écrire une fonction récursive qui calcule le carré d'un entier. Pour trouver un lien
entre carre(n) et carre(n-1), on utilise la formule donnée en énoncé : (n + 1)2 = n2 + 2n + 1. En
changeant n en n−1, la formule se réécrit n2 = (n−1)2 +2(n−1)+1 d'où carre(n)=carre(n-1)+2*n-1.
Dans le cas où n est un entier négatif, on utilise le fait que (−n)2 = n2 . On se ramène ainsi au cas
où n est un entier positif. Les appels récursifs successifs nous mènent au cas de base : si n = 0,
alors carre(n)=0.

Fonction carré (n : Entier) : Entier

Debut
Si(n=0)
Alors Renvoyer(0)
SinonSi(n<0)
Alors Renvoyer(carre(-n))
Sinon Renvoyer(carre(n-1)+2*n-1)
FinSi
Fin

2. On veut écrire une fonction récursive qui calcule la somme de 1 à un entier n :1+2+3+· · ·+(n−1)+n.
On remarque que si on connaît somme_recursif(n-1), alors pour avoir somme_recursif(n) il sut
d'ajouter n au résultat précédent. On prend comme convention que si n < 1, alors la somme est
nulle. Le cas de base est celui où n vaut 1, et dans ce cas la somme vaut 1. De l'explication
précédente on déduit :

Fonction somme_recursif (n : Entier) : Entier

Debut
Si(n<1)
Alors Renvoyer(0)
SinonSi(n=1)
Alors Renvoyer(1)
Sinon Renvoyer(somme_recursif(n-1)+n)
FinSi
Fin

Exercice 2
Une façon de caractériser les mots palindromes est la suivante : un mot est un palindrome si sa première
lettre est identique à sa dernière lettre et si le mot obtenu en eaçant ces deux lettres est aussi un
palindrome. Par exemple, radar est un palindrome car il commence et termine par un r, et le mot ada
est palindrome. Pour commencer on a besoin d'une fonction qui calcule une sous-chaîne de caractères :
Fonction sous_chaine(mot : chaîne de caractères;debut,fin : entier) : chaîne de caractères

Var i : entier
aux : chaîne de caractères
1
Debut
//On initialise la variable aux avec la chaîne de caractère vide (de longueur 0)
aux ← "";
//La concaténation de deux mots m1 et m2 est notée m1+m2
Pour i=debut à fin faire
aux ← aux+mot[i];
FinPour
Renvoyer(aux)
Fin

Cette fonction va nous permettre d'eacer la première et la dernière lettre d'un mot, en prenant le
sous-mot compris entre les indices 1 et long(mot)-2. Passons maintenant à l'écriture de la fonction
récursive.
Fonction palin_rec(mot : Chaîne de caractères) : Booleen

Var n : Entier;

Debut
n ← long(mot)
//Un mot de longueur 0 est un palindrome, et ce sera notre cas de base
Si(n=0)
Alors Renvoyer(vrai)
//Si la première et la dernière lettres coïncident, on les efface
//et on vérifie que le mot restant est aussi un palindrome
SinonSi(mot[0]=mot[n-1])
Alors Renvoyer(palin_rec(sous_chaine(mot,1,n-2)))
//Si ces deux lettres sont différentes, le mot n'est pas un palindrome
Sinon Renvoyer(faux)
FinSi
Fin

Exercice 3
On rappelle que les nombres de Fibonacci sont dénis de la façon suivante :

F0 = F1 = 1
Fn = Fn−1 + Fn−2 pour n ≥ 2

1. On applique la dénition :
• F2 = F1 + F0 = 1 + 1 = 2
• F3 = F2 + F1 = 2 + 1 = 3
• F4 = F3 + F2 = 3 + 2 = 5
• F5 = F4 + F3 = 5 + 3 = 8

2. Pour écrire une fonction récursive qui calcule le nième nombre de Fibonacci, il sut d'utiliser
directement les formules de l'énoncé. Le cas de base est celui où n = 0 ou n = 1, et dans ce cas
le nombre de Fibonacci est 1. Pour n ≥ 2 on applique la relation en faisant deux appels récursifs.
On prend comme convention que si l'entier passé en paramètre à la fonction est négatif, la fonction
renvoie 1.

Fonction fibo(n : Entier) : Entier

Debut
Si(n≤ 1)
Alors Renvoyer(1)
Sinon Renvoyer(fibo(n-1)+fibo(n-2))
FinSi
Fin

3. Comment écrire une fonction itérative (c'est-à-dire sans appel récursif) qui calcule la même chose
? On remarque que pour calculer Fn , il faut connaître Fn−1 et Fn−2 . Mais pour avoir Fn−2 , il
faut connaître Fn−3 et Fn−4 . . . L'idée est la suivante : pour calculer Fn , on va calculer tous les
nombres de Fibonacci qui le précèdent. Pour cela on peut imaginer deux façons de faire :
• soit on stocke tous ces résultats intermédiaires dans un tableau de taille n + 1 (et non pas
n car on va calculer F0 , F1 , . . . , Fn i.e. n + 1 nombres de Fibonacci), l'élément d'indice i du
tableau étant Fi , et on renvoie le dernier élément du tableau :
Fonction fibo_it1(n : Entier) : Entier

Var tab : Tableau(n+1) d'Entiers


i : Entier

Debut
Si(n≤ 1)
Alors Renvoyer(1)
Sinon
tab[0]← 1;
tab[1]← 1;
Pour i=2 à n faire
tab[i]← tab[i-1]+tab[i-2];
FinPour
Renvoyer(tab[n])
FinSi
Fin
• soit on ne garde à chaque étape que les résultats intermédiaires dont on a besoin, c'est-à-dire
les deux derniers nombres de Fibonacci calculés :
Fonction fibo_it2(n : Entier) : Entier

//n1 et n2 servent à stocker les deux derniers nombres de Fibonacci calculés


Var n1,n2 : Entier
i : Entier

Debut
//On initialise n1 et n2 à 1, qui est la valeur de F_0 et F_1
n1 ← 1;
n2 ← 1;
//Avant un passage dans la boucle, n1=F_i-1 et n2=F_i
//Après un passage dans la boucle, n1=F_i et n2=F_i+1
Pour i=1 à n-1 faire
n2 ← n2+n1;
n1 ← n2;
FinPour
//Enfin on renvoie n2, qui après tous les passages dans la boucle vaut F_n
Renvoyer(n2)
Fin

Exercice 4
On dénit la fonction suivante :
Fonction McCarthy(n : Entier) : Entier
Debut
Si (n>100)
Alors Renvoyer(n-10)
Sinon Renvoyer(McCarthy(McCarthy(n+11)))
FinSi
Fin

1. Pour n > 100, McCarthy(n) vaut toujours n − 10 puisque la condition est vériée.
2. On calcule les valeurs en appliquant le code de la fonction :
• Le calcul de McCarthy(98) nous donne aussi les autres valeurs demandées :
McCarthy(98) = McCarthy(McCarthy(109))
= McCarthy(99)
= McCarthy(McCarthy(110))
= McCarthy(100)
= McCarthy(McCarthy(111))
= McCarthy(101)
= 91
• McCarthy(99)=91 d'après le calcul précédent
• McCarthy(100)=91 d'après le calcul précédent

3. En déduire la valeur de McCarthy(n) pour n ≤ 100. Expliquer.

Vous aimerez peut-être aussi