IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Fonction récursive en C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 5
    Par défaut Fonction récursive en C
    Bonjour à tous,

    Je viens demander un peu d'aide sur un exercice.

    Il me semble que c'est ok pour la question 1 par contre je ne comprends pas la question 2, même en ayant retourné dans ma tête tous les sens possibles.

    Voici l'énoncé, merci par avance

    Nom : Capture d’écran 2018-03-08 à 19.54.22.png
Affichages : 1224
Taille : 255,2 Ko

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Bonjour et bienvenue,

    Citation Envoyé par Mandyy Voir le message
    Il me semble que c'est ok pour la question 1 par contre je ne comprends pas la question 2, même en ayant retourné dans ma tête tous les sens possibles.
    Ce n'est pas très difficile : une fonction récursive est une fonction qui fait référence à elle-même (et dans un programme informatique, c'est une fonction qui se rappelle elle-même). Dans la version itérative (avec boucle), tu examines une valeur et si ce n'est pas la bonne, tu te rabats sur les valeurs situées au dessus (de la valeur examinée exclue jusqu'à la fin de la table) ou au dessous (du début de la table jusqu'à la valeur examinée exclue) et tu cibles une nouvelle valeur dans cette plage au tour de boucle suivant.

    Dans la version récursive, il te suffit de renvoyer la valeur examinée si c'est la bonne, ou la valeur de retour d'un appel à ta fonction sur la nouvelle plage dans le cas contraire. Le fait que ta fonction se rappelle elle-même va provoquer une sorte de « mise en abîme » dans laquelle ta fonction va se rappeler en cascade, jusqu'à ce que la condition d'arrêt soit atteinte (valeur trouvée ou plage restante réduite à l'ensemble nul).

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 5
    Par défaut
    Bonjour Obsidian et merci pour ta réponse,

    Ton explication est très claire concernant les fonctions récursives, en fait je vois ce qu'est une fonction récursive et j'ai pu aussi comparer par analogie avec l'exemple très courant de la factorielle.
    Mais ton explication m'aide j'ai l'impression car ca recadre pas mal les choses.

    Ici ce qui me gênait, c'etait vraiment le sens de la question, pour moi ce n'etait pas clair.
    Dans la première question, c'était très clair: je dois renvoyer le rang de x si il appartient au tableau.

    Là je n'étais pas sure de ce que je devais renvoyer.

    Autre chose, au début il parle d'un tableau trié mais pour ce que l'on fait ça n'a pas de sens puisque si le tableau est trié, on connait déjà le rang du x que l'on cherche, pire on a même pas à chercher x, à par dans le cas où on ne connait pas la taille du tableau et que x est grand.
    Qu'en penses tu?

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Bonjour,

    Citation Envoyé par Mandyy Voir le message
    … en fait je vois ce qu'est une fonction récursive et j'ai pu aussi comparer par analogie avec l'exemple très courant de la factorielle. Mais ton explication m'aide j'ai l'impression car ca recadre pas mal les choses. Ici ce qui me gênait, c'etait vraiment le sens de la question, pour moi ce n'etait pas clair.
    C'est bien l'impression que j'en avais aussi à la lecture de ton message. Du coup, toute la subtilité consistait à exprimer cela sans révéler la solution.

    Là je n'étais pas sure de ce que je devais renvoyer.
    Effectivement : il faut faire une fonction qui rende exactement le même service, mais en suivant une approche récursive plutôt qu'itérative pour y arriver.

    Autre chose, au début il parle d'un tableau trié mais pour ce que l'on fait ça n'a pas de sens puisque si le tableau est trié, on connait déjà le rang du x que l'on cherche, pire on a même pas à chercher x, à par dans le cas où on ne connait pas la taille du tableau et que x est grand. Qu'en penses tu?
    C'est une excellente remarque mais attention, il y a une subtilité : le tableau doit être trié (suivant un ordre donc), mais rien ne dit qu'il doit être complet ! Si tu dois chercher l'existence du nombre « 7 » dans la suite [ 1, 3, 5, 8, 25, 32, 42, 78, 104 ] par exemple, rien ne te permet d'affirmer à l'avance que le chiffre s'y trouve. Par contre, le fait qu'elle soit triée et que l'on sache qu'elle contient neuf termes te permet de conclure d'emblée que tu auras forcément la réponse en un maximum de quatre tentatives.

  5. #5
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    et que l'on sache qu'elle contient neuf termes te permet de conclure d'emblée que tu auras forcément la réponse en un maximum de quatre tentatives.
    Oh c'est vil de voir de la dichotomie pour un problème aussi simple.

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Citation Envoyé par transgohan Voir le message
    Oh c'est vil de voir de la dichotomie pour un problème aussi simple.
    Pourquoi donc ?

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 5
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Bonjour,



    C'est bien l'impression que j'en avais aussi à la lecture de ton message. Du coup, toute la subtilité consistait à exprimer cela sans révéler la solution.



    Effectivement : il faut faire une fonction qui rende exactement le même service, mais en suivant une approche récursive plutôt qu'itérative pour y arriver.



    C'est une excellente remarque mais attention, il y a une subtilité : le tableau doit être trié (suivant un ordre donc), mais rien ne dit qu'il doit être complet ! Si tu dois chercher l'existence du nombre « 7 » dans la suite [ 1, 3, 5, 8, 25, 32, 42, 78, 104 ] par exemple, rien ne te permet d'affirmer à l'avance que le chiffre s'y trouve. Par contre, le fait qu'elle soit triée et que l'on sache qu'elle contient neuf termes te permet de conclure d'emblée que tu auras forcément la réponse en un maximum de quatre tentatives.
    Bonjour bis!

    Merci pour ton retour,

    Bien vu pour le fait que le tri ne soit pas complet! Je n'y avais pas du tout pensé!

    J'ai "fait" l'exercice en entier, c'est dommage car pour la dernière question j'ai une "conflicting type error" mais je n'arrive pas à voir ce qui pose problème
    J'ai pensé à mettre le prototype avant le main.
    Quoi qu'il en soit, ma fonction me parait très longue, j'ai un peu peur d'être à côté de la plaque ^^
    Si je comprends bien il faut renvoyer l intersection entre le segment [min, max] et le segment [idx_lower, idx_upper]
    La fonction binary_search retourne un int qui correspond à l'indice du x recherché.

    Nom : Capture d’écran 2018-03-09 à 17.37.19.png
Affichages : 798
Taille : 66,5 Ko


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
     
    void slice(int *array, int size, int min, int max, int *idx_lower, int *idx_upper){
     
    	int a = binary_search(array,min);
    	int b = binary_search(array, max);
     
    	if(*idx_lower < a && b < *idx_upper){
     
    		size = b-a;
    		for(int i = 0; i<size; i++){
    			printf("%d\n", array[a] + i );
     
    		}
    	}
    	else if(a > *idx_lower && b > *idx_upper){
     
    		size = *idx_upper - a;
    		for(int i = 0; i<size; i++){
    			printf("%d\n", array[a] + i);
    		}
    	}
    	else if(a < *idx_lower && b > *idx_upper){
    		size = *idx_upper - *idx_lower;
    		for(int i = 0; i<size; i++){
    			printf("%d\n", array[*idx_lower] + i);
    		}
    	}else{
    		size = b - *idx_lower;
    		for(int i = 0; i<size; i++){
    			printf("%d\n", array[*idx_lower] + i);
    		}
     
     
    	}
     
    }

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    « Re, »

    Citation Envoyé par Mandyy Voir le message
    Bien vu pour le fait que le tri ne soit pas complet! Je n'y avais pas du tout pensé!
    Oui mais justement : c'est une excellente chose d'être arrivée seule — et avant d'écrire la première ligne de code — à la conclusion que le problème est sans objet en l'absence de cette possibilité !

    Quoi qu'il en soit, ma fonction me parait très longue, j'ai un peu peur d'être à côté de la plaque ^^
    Si je comprends bien il faut renvoyer l intersection entre le segment [min, max] et le segment [idx_lower, idx_upper]
    Pas tout-à-fait : il s'agit cette fois non plus de restreindre la recherche à un élément mais à une plage, plage dont tous les éléments sont compris entre minimum et un maximum. Donc en fait, ici, min et max ne changent jamais (ce sont les consignes initiales), et idx_lower et idx_upper sont les bornes de ta plage, qui au départ délimitent le tableau entier puis se rapprochent peu à peu jusqu'à cerner parfaitement la zone qui nous intéresse.

    En fait, il s'agit simplement de mener deux binary_search en parallèle, une sur chaque borne. C'est aussi une manière utile d'exploiter le résultat de cette recherche si l'élément lui-même n'est pas trouvé. Il faudra juste penser à vérifier sur quel élément on se trouvait si on atteint l'ensemble nul (l'élément censé précéder la valeur cherchée ou censé la suivre) et comparer cela avec les consignes min et max pour être sûr de ne pas se tromper de borne finale.

Discussions similaires

  1. fonction récursive: erreur
    Par calla29 dans le forum Débuter
    Réponses: 3
    Dernier message: 16/05/2006, 11h51
  2. [VB6] XML, fonction récursive de recherche
    Par kboo dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 24/04/2006, 21h27
  3. [XSLT] fonction récursive à N niveaux
    Par Mike35 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 10/03/2006, 12h30
  4. Fonction récursive renvoi sur page d'erreur
    Par peck dans le forum Langage
    Réponses: 1
    Dernier message: 23/12/2005, 10h08
  5. Problème de fonction récursive avec un TcxDBTreeList
    Par isachat666 dans le forum Composants VCL
    Réponses: 1
    Dernier message: 05/12/2005, 13h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo