N - LSIS

publicité
Faculté des Sciences de Luminy
Algorithmique et programmation en langage C
Série d’exercices n° 6
Fonctions récursives
1
Ecrivez une fonction récursive qui calcule XN pour X réel quelconque et N entier positif ou nul. Mettez à profit la
remarque suivante :
1, si N = 0
 X × X N −1 et, si N est impair, N − 1 est pair

XN =
N
N
 2 2
X
et, si N est pair,
est entier
(
)

2
2
Le nombre de combinaisons Cnp de p objets parmi n
triangle de Pascal) :



Cnp = 


peut être calculé par l’expression récursive suivante (qui définit le
1, si p =0 ou p=n
Cnp−−11+Cnp−1, si 0< p<n
0, sinon
Ecrivez une fonction récursive qui calcule Cnp en fonction de n et p.
3
Une chaîne de caractères est un palindrome si elle a moins de deux caractères ou si son premier et son dernier caractères
sont identiques et la sous-chaîne obtenue en les retirant est elle aussi un palindrome : esoperesteicietserepose. Ecrivez
de façon itérative, puis récursive, la fonction
int palindrome(char *s, int debut, int fin)
qui rend 1 si la suite de caractères sdébut, sdébut+1, … sfin constitue un palindrome, 0 sinon.
4
A. Ecrivez la fonction récursive void miroir(void) qui lit caractère par caractère (par exemple, en utilisant la
fonction getchar()) une chaîne terminée par ‘?’ et l’affiche dans l’ordre inverse de celui de la lecture. Exemple
d’utilisation :
main() {
miroir();
}
Exemple d’exécution de ce programme :
Miroir, qui est la plus belle ?
? elleb sulp al tse iuq ,rioriM
B. Ecrivez une version sans variable locale de la fonction miroir.
5
Ecrivez une fonction
void ecriture(int nombre, int base);
qui affiche à l’écran l’expression du nombre indiqué dans la base indiquée. On supposera que nombre est positif ou
nul. Dans une première étape, intéressez-vous au cas où la base est 10.
Fichier « TD 06.doc » (état du 26/09/2012 à 10:46)
6
Un graphe est défini par la donnée d’un ensemble de points, appelés sommets, et d’un ensemble de segments, appelés
arêtes, dont les extrémités sont des sommets.
On considère un graphe représentant la carte routière d’une certaine région : les sommets
représentent des carrefours, les arêtes des tronçons de route. Tous les tronçons sont à double
sens ; il n’existe pas deux tronçons différents possédant les mêmes extrémités. Chaque tronçon
est affecté d’un nombre qui exprime sa longueur en Km.
12
10
5
20
20
Ce graphe est représenté dans un programme par une matrice M définie par
18
 longueur de l'arête joignant les sommets i et j, si elle existe
M i, j = 
 INT _ MAX, sinon
(INT_MAX est un entier invraisemblablement grand) Ecrivez une fonction récursive
void chemin(int dep, int arr)
qui recherche un (des) chemin(s) sans boucles joignant les sommets dep et arr. Le chemin sera défini par la suite des
sommets qui le constituent, et sera déposé dans un tableau global chemin.
A. Dans une première version, votre programme affichera tous les chemins joignant dep à arr.
B. Modifiez le programme précédent pour qu’il n’affiche qu’un chemin joignant dep à arr (le premier trouvé).
C. Modifier le programme du A pour qu’il affiche le chemin le plus court joignant dep à arr.
☺☺
Téléchargement