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. ☺☺