la récursivité
Répondre à la discussion
Affichage des résultats 1 à 15 sur 15

la récursivité



  1. #1
    invitee2f3230c

    la récursivité


    ------

    salut ,
    j'ai l'exercice suivant:
    Ecrire une procédure récursive permettant de remplir un tableau de 10 entiers reçu en paramètre.

    voici mon essai:
    Code:
    #include<stdio.h>
    #include<conio.h>
    int i=0,n=10;
    
    int*  remplir(int tab[])
    {
          if(i==n-1)
                  {
                      printf("taper l'element n°%d",i+1);
                      scanf("%d",&tab[i]);
                      return tab;
                  }
          else 
                  {
                      printf("taper l'element n°%d",i+1);
                      scanf("%d",&tab[i]);
                      i++;
                      return (remplir(tab[]));
                  }
    }
                      
                      
               
    int main()
    {
        int tab[10];
        tab=remplir(tab[]);
        
        getch();
        return 0;
    }
    l'erreur donné par le compilateur:
    18 C:\Dev-Cpp\révion_récursivité.cpp expected primary-expression before ']' token

    je ne sais pas quoi faire ,merci de m'aider à s'en sotir !

    a+

    -----

  2. #2
    Fanch5629

    Re : la récursivité

    Bonsoir.

    J'écrirais " remplir(tab) " au lieu de " remplir(tab[]) " aux lignes 18 et 27.

    A vérifier, je n'ai pas pratiqué depuis longtemps.

    Sinon, je ne peux pas affirmer que ton code va faire exactemnt ce que tu souhaites, mais cela fait partie de l'exercice que de le vérifier.

    Bon courage.
    Dernière modification par JPL ; 01/04/2010 à 20h25.

  3. #3
    invitee2f3230c

    Re : la récursivité

    bonsoir
    j'ai essayer de le faire mais malgré ça le code ne marche pas .
    Dernière modification par JPL ; 01/04/2010 à 20h25.

  4. #4
    whoami

    Re : la récursivité

    Bonjour,

    Commence par supprimer cette abominable utilisation de variables globales.

    Pour programmer proprement, une fonction doit recevoir en paramètres tout ce dont elle a besoin.

  5. A voir en vidéo sur Futura
  6. #5
    polo974

    Re : la récursivité

    C'est l'exemple type où la récursivité n'apporte rien, mais passons...

    Au fait, qu'apporte donc la récursivité?
    Un environnement local tout neuf à chaque nouvel appel!
    Les variables locales sont donc "nouvelles" à chaque niveau d'empilement, et dans ton essai, point de variable locales...

    corollaire: la récursivité est potentiellement gourmande en stockage sur la pile, et le pire que j'ai vu, c'est une fonction d'entrée/sortie potentiellement bloquante qui récursait en cas de blocage... Je ne vous dit pas les plantages qui en résultaient quand le périph était aux abonnés absents!
    Jusqu'ici tout va bien...

  7. #6
    danyvio

    Re : la récursivité

    Je n'ai pas approfondi le problème initial, mais je me demande pourquoi la séquence :
    Code:
    printf("taper l'element n°%d",i+1);
                      scanf("%d",&tab[i]);
    se trouve sous le contrôle du if et sous le contrôle du else
    
    Cette séquence est donc inconditionnelle, et l'écriture pourrait être :
    printf("taper l'element n°%d",i+1);
                      scanf("%d",&tab[i]);
    
    if(i==n-1)
                  {
                                        return tab;
                  }
          else 
                  {
                                        i++;
                      return (remplir(tab[]));
                  }
    Dernière modification par JPL ; 02/04/2010 à 16h07. Motif: Ajout de la balise Code pour la lisibilité
    On trouve des chercheurs qui cherchent ; on cherche des chercheurs qui trouvent !

  8. #7
    b@z66

    Re : la récursivité

    Déjà, le tab[] que tu définis dans ta fonction remplir est uniquement défini localement à cette fonction donc, à chaque fois que tu sortiras de cette fonction par un return, tu perdras le résultat de l'opération d'affectation que tu auras fait sur ce tableau avec la fonction scanf.
    La curiosité est un très beau défaut.

  9. #8
    b@z66

    Re : la récursivité

    Si tu veux que ton programme se compile, je te propose ça:

    Code:
    #include<stdio.h>
    int i=0,n=10;
    
    int*  remplir(int tab[])
    {
          printf("taper l'element n°%d",i+1);
          scanf("%d",&tab[i]);
      
          if(i==n-1)
                  {
                      return tab;
                  }
          else 
                  {
                      i++;
                      return (remplir(tab));
                  }
    }
                      
                      
               
    int main()
    {
        int tab[10];          /* tab: pointeur sur tableau d'entier */
        int *b;               /* b: pointeur sur entier */
        b=remplir(tab);       /* remplir() retourne un pointeur sur entier */
        
        return 0;
    }
    L'affectation avec b dans le main était nécessaire parce que tab et ce que renvoie remplir() ne sont pas du même type: il aurait fallu un transtypage de "pointeur sur entier" à "pointeur sur tableau d'entier" mais ça je ne sais pas faire. Sinon, l'utilité du programme reste globalement nulle(voir le message précédent) puisque tu vas récursivement définir jusqu'à 10 tableaux de 10 entiers(dont un seul sera modifié dans chacun de ces tableaux) simultanément dans ta mémoire! Le "remplir()" de ta fonction main ne te retournera, lui, au final que l'adresse du 10ème tableau que tu auras définis au plus profond de ta récursion avant d'en revenir. Tout cela est bien beau mais pour l'utilité globale du truc, c'est zéro...
    Dernière modification par b@z66 ; 02/04/2010 à 15h11.
    La curiosité est un très beau défaut.

  10. #9
    invitee2f3230c

    Re : la récursivité

    salut
    merci pour vos conseils et vous aides,le programme marche trés bien!
    une derniere questions svp
    je pense qu'il sera impossible de récupère le élément du tab car p (pointeur sur entier) va recevoir l'adresse du dernier élément ,n'est ce pas ?

    merci d'avance !

  11. #10
    Jack
    Modérateur

    Re : la récursivité

    En tout cas tab n'a pas bougé, lui.

    A+

  12. #11
    b@z66

    Re : la récursivité

    Citation Envoyé par Jack Voir le message
    En tout cas tab n'a pas bougé, lui.

    A+
    En tout cas, le tab qui est utilisé dans la sous fonction remplir n'est pas le même que celui de la fonction main: même s'ils sont au départ identiques au lancement de la sous fonction, ils occupent des espaces mémoires différents. Alors ne parlons pas plus de ce qui se passe quand la fonction remplir fait appel à elle-même, le résultat sur la manipulation de ce tableau reste le même: on recréé à nouveau d'autres tableaux! La grosse erreur, à mon sens, déjà dans ce programme, c'est de ne pas avoir utiliser un autre nom pour le tableau de la sous-fonction que celui du main: cela prête à confusion sur l'identité de ce qui est manipulé dans ce programme alors que ce simple changement de nom n'aurait finalement pas eu d'incidence sur l'exécution du programme elle-même.
    La curiosité est un très beau défaut.

  13. #12
    Jack
    Modérateur

    Re : la récursivité

    En tout cas, le tab qui est utilisé dans la sous fonction remplir n'est pas le même que celui de la fonction main: même s'ils sont au départ identiques au lancement de la sous fonction, ils occupent des espaces mémoires différents
    J'ai du mal à te suivre.

    La variable tab de la fonction remplir n'est qu'un pointeur local initialisé à l'adresse du tableau tab de la fonction main. Comme il n'y a aucune gestion dynamique dans la fonction remplir, je ne vois pas ce que tu entends par espace mémoire de ce tableau. Il occupe 10 entiers et il est unique pour tout le programme.

    A+

  14. #13
    b@z66

    Re : la récursivité

    Citation Envoyé par Jack Voir le message
    J'ai du mal à te suivre.

    La variable tab de la fonction remplir n'est qu'un pointeur local initialisé à l'adresse du tableau tab de la fonction main. Comme il n'y a aucune gestion dynamique dans la fonction remplir, je ne vois pas ce que tu entends par espace mémoire de ce tableau. Il occupe 10 entiers et il est unique pour tout le programme.

    A+
    Ok, mea culpa, tu as raison, je viens de vérifier ça et cela fonctionne effectivement déjà bien comme c'est écrit. Je pensais que ce qui était passé en paramètre était le contenu du tableau entier mais c'est effectivement faux, c'est juste le pointeur. Ça faisait un moment que je n'avais pas compilé de c.

    Citation Envoyé par hindou90
    salut
    merci pour vos conseils et vous aides,le programme marche trés bien!
    une derniere questions svp
    je pense qu'il sera impossible de récupère le élément du tab car p (pointeur sur entier) va recevoir l'adresse du dernier élément ,n'est ce pas ?
    Le pointeur que va te renvoyer le remplir de la fonction main(ainsi que les autres) pointera bien effectivement sur le dernier élément du tableau.
    Dernière modification par b@z66 ; 06/04/2010 à 20h55.
    La curiosité est un très beau défaut.

  15. #14
    invitee2f3230c

    Re : la récursivité

    merci pour ces riches réponses ,donc cet exercice n'a pas d'utilité en ce qui concerne la récursivité ,autrement la récursivité ne joue pas un rôle important !


    merci

  16. #15
    Jack
    Modérateur

    Re : la récursivité

    donc cet exercice n'a pas d'utilité en ce qui concerne la récursivité
    aucun

    autrement la récursivité ne joue pas un rôle important
    ??? Je ne comprends pas. C'est une question?

Discussions similaires

  1. récursivité, itération
    Par invite1acecc80 dans le forum Logiciel - Software - Open Source
    Réponses: 6
    Dernier message: 03/02/2010, 11h28
  2. Comment python gère-t-il la récursivité ?
    Par martini_bird dans le forum Logiciel - Software - Open Source
    Réponses: 26
    Dernier message: 14/11/2006, 02h00
  3. Intégrale et recursivité
    Par Olorin dans le forum Mathématiques du supérieur
    Réponses: 2
    Dernier message: 17/01/2005, 12h22
Découvrez nos comparatifs produits sur l'informatique et les technologies.