CH.8 Décidabilité
Propriétés des langages récursivement énumérables : Fermés par union mais pas par intersection. Page 2. Automates ch8 3. Théorème : Le langage L est récursif si
05/06 - 2.2.3 Récursivité gauche
Un symbole non terminal A d'une grammaire est dit récursif si A algébrique non récursive gauche qui reconna?t le même langage.
Introduction `a la Programmation des Algorithmes 3.2. Langage C
Langage C – Fonctions récursives. François Fleuret https://fleuret.org/11x001/. On peut définir des fonctions mathématiques de mani`ere récursive.
Calculabilité
décidé par une certaine machine de Turing. Un langage ou un problème décidable est aussi dit récursif. Un langage qui n'est.
INDÉCIDABILITÉ MT ET GRAMMAIRES
Un langage L est récursif ssi L et ¬L sont récursivement énumérables. 10. Preuve. Page 11. Propriétés des langages récursifs.
Thème 1 : la récursivité 1 Rappels sur les fonctions
Pour définir nos fonctions nous utiliserons du pseudo-code ou la syntaxe du langage Python rappelée ci-dessous. Définition de la fonction : def maFonction(x1..
Programmation récursive 1. Quest-ce que la programmation récursive
Définition : la programmation récursive est une technique de programmation qui remplace les question de goût de style et de langage de programmation.
Calculabilité Cours 3 : réductions
L'ensemble des langages décidables avec oracle B est {A
Introduction `a la calculabilit´e
Langages récursifs et récursivement énumérables. Un langage est récursif s'il est décidé par une machine de Turing. Un langage est récursivement énumérable
L3 Informatique Calculabilité 18 septembre 2014 Exercice 1
18 sept. 2014 Exercice 1 (Clôture des langages récursifs) ... Montrer que L est un langage récursivement énumérable si et seulement s'il.
[PDF] Algorithmique Récursivité
Moyen simple et élégant de résoudre certain problème Définition On appelle récursive toute fonction ou procédure qui s'appelle elle même Algorithme Fact
[PDF] LIFAP2 : ALGORITHMIQUE ET PROGRAMMATION RECURSIVE
Algorithme itératif / récursif Programmation impérative / fonctionnelle Langage commun entre la machine et nous : Scheme N Guin – M Lefevre
[PDF] Séance 5 : Fonctions récursives et machine de Turing
Or le langage RP est équivalent à une partie du langage Pascal seulement avec la boucle for et sans appels récursifs V 1 2 3- Quelques exemples de fermeture
[PDF] Programmation récursive 1 Quest-ce que la programmation - LIPN
Définition : la programmation récursive est une technique de programmation qui remplace les instructions de boucle (while for etc ) par des appels de fonction
[PDF] La récursivité - Zeste de Savoir
12 août 2019 · La récursivité est un concept général qui peut être illustré dans (quasiment) tous les langages de programmation et qui peut être utile
[PDF] Récursivité
C'est ce qui garantit que le programme s'achèvera Exercice 5 Un programme en langage python : Jean-Manuel Mény – Ludovic Fasquelle – Irem de Lyon
[PDF] Récursivité - LACL
langages de programmation tel que le langage C Bien entendu cela complique l'implémentation d'un tel langage mais facilite la tâche du programmeur
[PDF] Récursivité
On peut citer à ce sujet Guido van Rossum le créateur du langage Python : I don't believe in recursion as the basis of all programming This is a fundamental
[PDF] Thème 1 : la récursivité 1 Rappels sur les fonctions
Pour définir nos fonctions nous utiliserons du pseudo-code ou la syntaxe du langage Python rappelée ci-dessous Définition de la fonction : def maFonction(x1
Introduction `a la Programmation des Algorithmes
3.2. Langage C - Fonctions r´ecursives
Fran¸cois Fleuret
https://fleuret.org/11x001/On peut d´eifinir des fonctions math´ematiques de mani`ere r´ecursive.
Par exemple la fonction factorielle:
f(n) =( 1 si n<= 0, n·f(n-1)sinon.Fran¸cois Fleuret Introduction `a la Programmation des Algorithmes / 3.2. Langage C - Fonctions r´ecursives 1 / 21
Des constructions similaires sont possibles en programmation.1#include
2 3intfactorielle (intn) {
4if(n<= 0 )return 1 ;
5elsereturn n * fa ctorielle(n- 1 );
6} 78intmain (void){
9for(intk = 0 ;k <= 5 ;k ++){
10printf("%d! = %d\n",k, factorielle(k));
11}12return0 ;
13} aiÌifiÌiche0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
Fran¸cois Fleuret Introduction `a la Programmation des Algorithmes / 3.2. Langage C - Fonctions r´ecursives 2 / 21Cela nous donne par substitution,
factorielle( 4 4 factorielle( 3 4 3 factoriell e( 2 4 3 2 factorielle( 1 4 3 2 1 factor ielle( 0 4 3 2 1 1 12 2 1 1 241 1 24
1 24
Fran¸cois Fleuret Introduction `a la Programmation des Algorithmes / 3.2. Langage C - Fonctions r´ecursives 3 / 21
Une fonction r´ecursive doit int´egrer unecondition d'arrˆetqui retourne une valeur sans appel r´ecursif.1intfactorielle (intn) {
2if(n<= 0 )return 1 ;
3elsereturn n * fa ctorielle(n- 1 );
4}Sans une telle condition, ou si elle n'est jamais r´ealis´ee, la fonction ne s'arrˆete
pas. Par exemple si nous ´ecrivons une fonction pour calculerPn k=1k:1intsomme (intn) {
2if(n== 1 )return 1 ;
3elsereturn n + so mme(n- 1 );
4}Elle ne s'arrˆete pas si elle est appel´ee avecn<=0.Fran¸cois Fleuret Introduction `a la Programmation des Algorithmes / 3.2. Langage C - Fonctions r´ecursives 4 / 21Une bonne habitude de programmation est de v´eriifier que les valeurs des
arguments ont bien les propri´et´es attendues et `a r´eagir en cons´equence si ce n'est pas le cas. Une mesure brutale consiste `a appelerabort, d´eifinie dans stdlib.h, qui crash le programme.1#include
2#include
3 4intsomme (intn) {
5if(n<= 0 )abort();
6if(n== 1 )return 1 ;
7elsereturn n + so mme(n- 1 );
8} 910intmain (void){
11printf("%d\n",somme (10));
12printf("%d\n",somme (-3));
13return0 ;
14} aiÌifiÌiche 55Aborted (core dumped)
Fran¸cois Fleuret Introduction `a la Programmation des Algorithmes / 3.2. Langage C - Fonctions r´ecursives 5 / 21
Il arrive que l'on veuille programmer plusieurs fonctions qui s'utilisent mutuellement. On parle alors der´ecursion mutuelle. On doit alors d´eclarer l'une d'elle avant de les d´eifinir.Fran¸cois Fleuret Introduction `a la Programmation des Algorithmes / 3.2. Langage C - Fonctions r´ecursives 6 / 211#include
2#include
3 4intimpair (intn);
56intpair (intn) {
7if(n< 0 )a bort();
8elseif (n== 0 )re turn1 ;
9elsereturn impair(n -1);
10} 1112intimpair (intn) {
13if(n< 0 )a bort();
14elseif (n== 0 )re turn0 ;
15elsereturn pair(n -1);
16} 1718intmain (void){
19printf("%d %d %d\n",pair( 13),pair( 4),impair( 6));
20return0 ;
21}Fran¸cois Fleuret Introduction `a la Programmation des Algorithmes / 3.2. Langage C - Fonctions r´ecursives 7 / 21
Une convention importante en C pour l'´evaluation d'op´erateurs bool´eens est que les op´erandes ne sont elles-mˆemes calcul´ees que si cela est n´ecessaire. On parle d'´evaluationparesseuse.Par exemple pour ´evaluer
0 f(x) comme l'´evaluation se fait de gauche `a droite, il n'est pas n´ecessaire de calculer f(x).Si nous d´eifinissons1intdivise (inta, int b) {
2printf("Est-ce que %d divise %d?\n",b, a);
3returna %b== 0 ;
4}Fran¸cois Fleuret Introduction `a la Programmation des Algorithmes / 3.2. Langage C - Fonctions r´ecursives 8 / 215intmain (void){
6printf("calcul de q\n");
7intq = div ise(10,5 )&& divise( 20,4 );
8printf("calcul de r\n");
9intr = div ise(10,3 )&& divise( 20,4 );
10printf("calcul de t\n");
11intt = div ise(10,3 )|| divise( 20,4 );
12printf("calcul de u\n");
13intu = div ise(10,2 )&& divise( 20,4 )&& divise( 6,4 )&& divise( 15,3 );
14return0 ;
15} aiÌifiÌiche calcul de qEst-ce que 5 divise 10?
Est-ce que 4 divise 20?
calcul de rEst-ce que 3 divise 10?
calcul de tEst-ce que 3 divise 10?
Est-ce que 4 divise 20?
calcul de uEst-ce que 2 divise 10?
Est-ce que 4 divise 20?
Est-ce que 4 divise 6?
Fran¸cois Fleuret Introduction `a la Programmation des Algorithmes / 3.2. Langage C - Fonctions r´ecursives 9 / 21
Cela nous permet par exemple de re-´ecrire
1intpair (intn) {
2if(n< 0 )a bort();
3returnn == 0 || impair(n -1);
4} 56intimpair (intn) {
7if(n< 0 )a bort();
8returnn > 0 && pair(n -1);
9}Fran¸cois Fleuret Introduction `a la Programmation des Algorithmes / 3.2. Langage C - Fonctions r´ecursives 10 / 21Notez que ces fonctions ´etaient des exemples r´ecursifs tr`es ineiÌifiÌicaces. En
pratique on ´ecrirait:1intpair (intn) {
2if(n< 0 )a bort();
3returnn %2== 0 ;
4} 56intimpair (intn) {
7if(n< 0 )a bort();
8returnn %2== 1 ;
9}Fran¸cois Fleuret Introduction `a la Programmation des Algorithmes / 3.2. Langage C - Fonctions r´ecursives 11 / 21
R´ecursivit´e terminale
Fran¸cois Fleuret Introduction `a la Programmation des Algorithmes / 3.2. Langage C - Fonctions r´ecursives 12 / 21Nous avons vu que les variables locales sont r´eserv´ees sur une "pile" en
m´emoire. Ce m´ecanisme est le mˆeme pour les variables locales `a une fonction.En plus des variables, quand une fonction est appel´ee, l'ordinateur m´emorise sur
cette pile des informations n´ecessaires pour savoir o`u continuer l'ex´ecution quand la fonction se termine. Cela signiifie qu'en pratique un programme occupe pour cela une quantit´e de m´emoire proportionnelle au nombre d'appels de fonctions imbriqu´es.Fran¸cois Fleuret Introduction `a la Programmation des Algorithmes / 3.2. Langage C - Fonctions r´ecursives 13 / 21
Cela peut poser probl`eme si on fait beaucoup d'appels r´ecursifs1#include
2 3/* retourne le nombre de diviseurs de n qui sont >= k */
4intnb_diviseurs (intn, int k) {
5if(k> n) r eturn0 ;
6intnb = nb _diviseurs(n,k + 1 );
7if(n% k == 0 )nb ++;
8returnnb;
9} 1011intmain (void){
12printf("%d\n",nb_di viseurs(245,1 ));
13printf("%d\n",nb_di viseurs(317322,1 ));
14printf("%d\n",nb_di viseurs(8133453,1 ));
15return0 ;
16} aiÌifiÌiche 6 36Segmentation fault (core dumped)
Fran¸cois Fleuret Introduction `a la Programmation des Algorithmes / 3.2. Langage C - Fonctions r´ecursives 14 / 21Ce probl`eme peut ˆetre ´evit´e dans une fonctionsi aucune op´eration n'est
n´ecessaire entre le retour de l'appel r´ecursif et le retour de la fonction elle mˆeme.Puisque l'ordinateur n'a pas besoin de repasser par la fonction apr`es l'appel, ilpeut revenir directement apr`es le premier appel `a cette fonction r´ecursive, et ne
conserve rien sur la pile apr`es chaque appel r´ecursif. On parle alors de fonctionr´ecursive terminale.Fran¸cois Fleuret Introduction `a la Programmation des Algorithmes / 3.2. Langage C - Fonctions r´ecursives 15 / 21
Voici une version r´ecursive terminale:
1#include
2 3/* est-ce que n a un diviseur >= k ? */
4inta_un_diviseur (intn, int k) {
5if(k> n) r eturn0 ;
6if(n%k== 0 )return 1 ;
7returna_un_diviseur (n,k +1);
8} 910intmain (void){
11printf("%d\n",a_un_ diviseur(479001599,2 ));
12return0 ;
13} aiÌifiÌiche 0 La fonctiona_un_diviseurappel´ee ligne 11 entraˆınera un grand nombre d'appels r´ecursifs, mais d`es que l'un des returns des lignes 5 ou 6 sera ex´ecut´e, le programme pourra retourner directement `a la ligne 11, sans repasser un grand nombre de fois ligne 7.Fran¸cois Fleuret Introduction `a la Programmation des Algorithmes / 3.2. Langage C - Fonctions r´ecursives 16 / 21R´ecursion
R´ecursion terminale
Fran¸cois Fleuret Introduction `a la Programmation des Algorithmes / 3.2. Langage C - Fonctions r´ecursives 17 / 21
Il est g´en´eralement possible de re-´ecrire une fonction r´ecursive non-terminalesous une forme r´ecursive terminale en rajoutant des arguments qui repr´esentent
des quantit´es accumul´ees. Cette fonction n'´etait pas r´ecursive terminale, d'o`u le crash quand elle a ´et´e appel´ee avec une grosse valeur:1intnb_diviseurs (intn, int k) {
2if(k> n) r eturn0 ;
3intnb = nb _diviseurs(n,k + 1 );
4/* ici nb est le nombres de diviseurs de n qui sont >= k+1 */
5if(n% k == 0 )nb ++;
6/* ici nb est le nombres de diviseurs de n qui sont >= k */
7returnnb;
8}Fran¸cois Fleuret Introduction `a la Programmation des Algorithmes / 3.2. Langage C - Fonctions r´ecursives 18 / 21Par exemple:
1#include
2 3/* retourne nb + le nombre de diviseurs de n qui sont >= k de fa¸con `a
4ce que si on l'appelle avec nb = le nombre de diviseurs de n qui sont
5< k elle retourne le nombre total de diviseurs de n */
67intnb_diviseurs (intn, int k, int nb) {
8if(k> n) r eturnn b;
9/* ici nb est le nombre de diviseurs de n qui sont < k */
10if(n% k == 0 )nb ++;
11/* ici nb est le nombre de diviseurs de n qui sont <= k */
12returnnb_diviseurs( n,k + 1 ,nb);
13} 1415intmain (void){
16printf("%d\n",nb_di viseurs(245,1 ,0 ));
17printf("%d\n",nb_di viseurs(317322,1 ,0 ));
18printf("%d\n",nb_di viseurs(8133453,1 ,0 ));
19return0 ;
20} aiÌifiÌiche 6 3616
Fran¸cois Fleuret Introduction `a la Programmation des Algorithmes / 3.2. Langage C - Fonctions r´ecursives 19 / 21
On peut cacher les arguments suppl´ementaires en cr´eant une fonction qui ex´ecute le premier appel r´ecursif:1/* retourne nb + le nombre de diviseurs de n qui sont >= k */
2intnb_diviseurs_re c(intn ,int k, int nb) {
3if(k> n) r eturnn b;
4if(n% k == 0 )nb ++;
5returnnb_diviseurs_ rec(n,k + 1 ,nb);
6} 78intnb_diviseurs (intn) {
9returnnb_diviseurs_ rec(n,1 ,0 );
10}Fran¸cois Fleuret Introduction `a la Programmation des Algorithmes / 3.2. Langage C - Fonctions r´ecursives 20 / 211#include
2#include
3 4floatracine_rec (floatx, float a, float b, float eps) {
5floatc = ( a+ b) / 2 ;
6if(b- a < eps) return c;
7else8if(c* c >= x)
9returnracine_rec(x, a, c, eps);
10else
11returnracine_rec(x, c, b, eps);
12} 1314floatracine (floatx) {
15if(x< 0 )a bort();
16returnracine_rec(x, 0 ,x +1,1e-6 );
17} 1819intmain (void){
20printf("%f\n",racine (2));
21return0 ;
22}aiÌifiÌiche
1.414213
Fran¸cois Fleuret Introduction `a la Programmation des Algorithmes / 3.2. Langage C - Fonctions r´ecursives 21 / 21
quotesdbs_dbs45.pdfusesText_45[PDF] fonction primitive récursive exercice corrigé
[PDF] théorème de godel démonstration
[PDF] codage de godel
[PDF] théorème de gödel pdf
[PDF] arithmétique de robinson
[PDF] nombre de godel
[PDF] godel dieu
[PDF] théorème d'incomplétude pour les nuls
[PDF] incomplétude définition
[PDF] introduction ? la calculabilité pdf
[PDF] indemnité prof principal 2017
[PDF] isoe prof principal
[PDF] hsa prof
[PDF] indemnite tuteur stagiaire education nationale