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

Scheme Discussion :

Renvoyer une liste


Sujet :

Scheme

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 59
    Points : 17
    Points
    17
    Par défaut Renvoyer une liste
    Bonjour,

    en scheme , j'ai un exercice qui me demande d'écrire une fonction qui prend en paramètre une liste et un entier e et qui me renvoie une liste privée de la 1ere occurrence de e , par exemple :

    (fonction (list 4 2 3 5 6 5 8) 5) --> (4 2 3 6 5 8)

    mais je ne sais vraiment pas comment traiter ce probleme sur le plan algorithmique , je parle du cas général car les cases de base ( liste vide et liste qui contient qu'un seul entier je sais les traiter ) , quelqu'un a t'il une idée ?

    merci .

  2. #2
    Membre régulier Avatar de +Guilhem
    Profil pro
    Ingénieur d'études Java/JEE
    Inscrit en
    Novembre 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur d'études Java/JEE

    Informations forums :
    Inscription : Novembre 2007
    Messages : 78
    Points : 112
    Points
    112
    Par défaut
    Sans vouloir être désagréable, c'est un problème assez simple que tu devrais savoir résoudre depuis le temps que tu fréquentes ce forum...

    - Si l'élément sur lequel tu te trouves est égal à "e", qu'est-ce qu'il faut faire ?
    - Si l'élément sur lequel tu te trouves est différent de "e", qu'est-ce qu'il faut faire ?

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 59
    Points : 17
    Points
    17
    Par défaut
    si l'élément sur lequel je me trouve est égal à e , je renvoie le reste de toute la liste , sinon je continue de parcourir la liste , tu es d'accord avec ça ?

  4. #4
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 59
    Points : 17
    Points
    17
    Par défaut
    je fais pas de scheme tous les jours hein guillem , au mieux tous les 15 jours donc désolé si ça parait simple pour toi mais pas pour moi...

    je ne vois pas comment dire en scheme "on renvoie le reste de la liste + les termes différents de e .

  5. #5
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Tu nous refait le coup tous les 15 jours justement...
    Enfin on va te faciliter la tâche, il y a exactement 3 cas :
    1. La liste est vide -> On renvoie la liste vide
    2. La liste commence par un élément qui n'est pas e -> On renvoie cet élément plus la queue de la liste à laquelle on retire le premier élément égal à e
    3. La liste commence par e -> On renvoie la queue de la liste


    A toi de traduire ça en Scheme, on t'a suffisamment mâché le travail.

    --
    Jedaï

  6. #6
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 59
    Points : 17
    Points
    17
    Par défaut
    Merci jedai j'essaye de faire celà , les cas particuliers je les connaissais , c'est le cas principal qui m'intéressait , tu m'as bien aiguillé je vais essayer de le faire .

    Essayez d'etre plus agréable s'il vous plait , vous avez peu de messages sur ce forum et vous êtes souvent désagréables et c'est soulant d'entendre raler à chaque message et même si c'est pas votre intention vous laissez clairement cette impression , les autres modérateurs sur les autres forums ont beaucoup plus de messages et ils font pas une crise chaque fois qu'un débutant demande de l'aide .

    Ici il y a peu de messages donc théoriquement vous pouvez consacrez légèrement plus de temps aux explications . Si c'est un forum réservé aux experts dites le et au quel cas ma place n'est pas ici vu que je débute . Essayez de vous mettre un peu à la place des débutants qui n'ont jamais codé de leur vie et qui font ça très très occasionnellement .

    Merci bien de votre aide .

  7. #7
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Dans le premier sujet que tu as créés je t'avais dis que tu postais trop sans chercher et que donc tu allais revenir régulièrement poster des questions que tu devrais résoudre. Et c'est le cas.

    Il faut que tu fasses plus d'effort par toi même . Ici rien ne montre que tu n'as réfléchi tout seul le moins du monde.

    Essayes tu d'apprendre tout seul chez toi ?
    Si oui, tu devrais considérer de t'armer d'un livre (de l'acheter donc).
    Si tu en as un, ce genre de réponse devrait être résolu par sa lecture attentive.

    Ce que tu essayes de faire est une forme de filtre naïf et primitif. C'est extrêmement classique ce genre de chose dans la programmation fonctionnelle.

    Je te le redis, sans méchanceté : si tu viens poser ce genre de questions régulièrement, c'est que tu manque de persévérance. Apprendre sérieusement à programmer demande de la persévérance. Il faut s'arracher les cheveux et en dernier recours demander de l'aide.

    Par contre ta remarque sur le nombre de message n'implique rien du tout. Les personnes ici ne passent pas leur temps à attendre des messages : ils font autre chose dans la vie. Ils n'ont donc pas plus ou moins de temps que les autres personnes qui fréquentent le forum.

    Bon courage

  8. #8
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 59
    Points : 17
    Points
    17
    Par défaut
    garulfo écoute je suis pas doué et j'ai beau m'arracher les cheveux depuis 2 jours je ne trouve pas , j'arrive à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    (define (fonction L e)
      (if (pair? L)
          (if (not (= (car L) e))
              (cons (car L) Alors je suis désolé mais j'y arrive pas j'y arrive pas j'y peu rien , vos eleves ont 20/20 partout ? je ne sais pas traduire ce que jedai à dit et que je dois mettre à cette ligne à savoir plus la queue de la liste à laquelle on retire le premier élément égal à e
              (list (cdr L))     
              )
          (list)
          )
          )
    avez vous DES indices car je ne sais plus quoi faire , merci bien .

  9. #9
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    La récursion est un concept fondamental en informatique... Elle est censée faire quoi ta fonction ? Elle est pas censé prendre 2 argument e et L et renvoyer L où on a retiré la première occurrence de e, justement ?

    Tu as d'autres erreur par ailleurs, par exemple (list (cdr L)) n'est pas la queue de L, c'est une liste comportant un élément qui est la queue de L, autrement dit si L = '(1 2 3), c'est '((2 3)) alors que tu veux '(2 3).

    --
    Jedaï

  10. #10
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 59
    Points : 17
    Points
    17
    Par défaut
    jedai j'arrive à un nouveau code plus sympa :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    (define (fonction L e)
      (if (pair? L)
          (if (not (= (car L) e))
              (cons (car L) (fonction (- (cdr L) e)))
              (list (cdr L))
              )
          (list)
          )
      )
    qu'en dis tu?

  11. #11
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 59
    Points : 17
    Points
    17
    Par défaut
    il marche pas , c'était trop beau , je l'ai mal testé .

  12. #12
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    C'est quoi ce code :
    '-' c'est une opération sur des nombres, pas sur une liste et un élément.

    Et tu n'as toujours pas corrigé :
    --
    Jedaï

  13. #13
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 59
    Points : 17
    Points
    17
    Par défaut
    ben ma fonction prend en paramètres une liste et un nombre , donc c'est une opération sur une liste et un nombre ?

    maintenant la récursion se fait peut etre juste sur les nombres de la liste .

    Je ne sais plus quoi faire pour la récursion , j'en ai fait bcp des exercices dessus mais là je ne sais pas et c'est pas faute d'essayer .

    pour renvoyer la queue de la liste , euh je vois pas trop ce que tu veux dire , quoi écrire à part (list (cdr)) , par (fonction (cdr L)) ?

  14. #14
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Ca y est, tu est reparti dans ton truc : "je déplace les parenthèses et je met n'importe quels opérateurs et fonction au hasard jusqu'à ce que ça marche"...

    ben ma fonction prend en paramètres une liste et un nombre , donc c'est une opération sur une liste et un nombre ?
    Ta fonction (que tu ferais mieux d'appeler autrement que "fonction") oui, mais pas "-", donc que vient faire "-" là dedans ? Je n'arrive même pas à comprendre comment tu en es arrivé à le mettre là.

    pour renvoyer la queue de la liste , euh je vois pas trop ce que tu veux dire , quoi écrire à part (list (cdr)) , par (fonction (cdr L))
    Encore n'importe quoi, pourquoi voudrais-tu mettre "fonction" dans ce cas, il s'agit simplement de renvoyer la queue de la liste, c'est-à-dire (cdr L). (list a b c) crée une liste avec les éléments a, b et c dedans, donc (list (cdr L)) crée une liste à un élément, cet élément étant la queue de la liste L, or tu veux renvoyer la queue de la liste L elle-même, pas une liste qui contient la queue.

    --
    Jedaï

  15. #15
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 59
    Points : 17
    Points
    17
    Par défaut
    non jedai sincèrement là j'ai pas du tout fait joujoue avec les parenthèses , j'arrive pas du tout à trouver le schéma de récursion tout simplement...

    "renvoyer la liste à laquelle on retire le 1er élement de " , donc on appelle la fonction jusqu'à ce que l'élément soit e, dès que c'est e on le retire ( et pour le retirer faut bien faire une opération , d'où mon idée du moins mais oui je savais qu'il était mal placé mais je l'ai placé au début comme dans mon cours et ça n'a pas marché...) et ensuite on renvoie la queue de la liste , donc en scheme , pour appeler la fonction c'est :

    (fonction (cdr L) e) , pour enlever le e :

    (- (fonction (cdr L) e) e)

    et pour tout renvoyer la queue : (cdr L)

    t'es d'accord avec moi pour l'explication?

  16. #16
    Membre éclairé
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Points : 803
    Points
    803
    Par défaut
    Jedaï t'as carrément donné la solution. Relis ce qu'il a dit:

    1. La liste est vide -> On renvoie la liste vide
    2. La liste commence par un élément qui n'est pas e -> On renvoie cet élément plus la queue de la liste à laquelle on retire le premier élément égal à e
    3. La liste commence par e -> On renvoie la queue de la liste
    Il y a trois cas à considérer. Qu'est-ce qu'on utilise pour vérifier des propriétés et faire des actions? Indice, ça commence par CON.

    Le premier test à effectuer est si la liste est vide. Quelle fonction permet de vérifier cela? Et si la liste est vide, on renvoie la liste vide. Comment est-ce qu'on fait une liste vide?

    Le second test demande si le premier élément de la liste est différent de e. Quelle fonction permet d'extraire le premier élément d'une liste? Quelle fonction permet de voir si deux nombres sont inégaux? L'action à prendre est de joindre le premier élément de la liste au résultat de l'application de la fonction au reste de la liste. Quelle fonction permet d'ajouter un élément à une liste? Quelle fonction donnent le reste d'une liste?

    Le troisième test est pour tous les autres cas. Quel mot permet de décrire tous les autres cas? Et comment est-ce qu'on fait pour donner la queue (tous les éléments sauf le premier) d'une liste?

    C'est assez d'indices? Si tu piges toujours pas après ça, consulte ton professeur, car je peux pas donner plus d'informations sans donner la réponse.

  17. #17
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 59
    Points : 17
    Points
    17
    Par défaut
    gnu le plus gros probleme que j'ai c'est la récurisivté dans ce cas précis , néanmoins tu m'as donné un indice intéressant je crois que je peux utiliser la fonction append :

    (define (retire L e)
    (if (pair? L)
    (if (not (= (car L) e))
    (append (cons (car L) (retire (cdr L) e)) e))
    (cdr L)
    )
    (list)
    )
    )

    je ne sais pas comment retirer le e , je ne peux mettre le me signe - nullepart car il prend que des nombres en arguments... c'est ça mon principal soucis...

  18. #18
    Membre éclairé
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Points : 803
    Points
    803
    Par défaut
    T'as pas besoin d'utiliser la soustraction. Si je reprends ton exemple du début:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (retire (list 4 2 3 5 6 5 8) 5) --> (4 2 3 6 5 8)
    Il faut que tu fasses faire à ton code les étapes suivantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (cons 4 (cons 2 (cons 3 '(6 5 8))))
    That's it. C'est super simple à faire. Si le premier élément de la liste est pas e, tu l'ajoutes au résultat de retirer l'élément e du reste de la liste. Et quand ton premier élément est e, tu retournes le reste de la liste que tu as.

    Le code que tu as est quasiment ce qu'il faut. T'as pas besoin de append.

  19. #19
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par Erwane Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    (define (retire L e)
      (if (pair? L)
          (if (not (= (car L) e))
              (append (cons (car L) (retire (cdr L) e)) e))
              (cdr L)
              )
          (list) 
          )
      )
    Ton expression n'est même pas correctement parenthésée.
    C'est ça que Jedaï voulait dire en disant que tu fais joujou avec les parenthèses.
    Si tu utilisais l'indenteur de DrScheme tu verrais que ce que tu as écris correspond à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    (define (retire L e)
      (if (pair? L)
          (if (not (= (car L) e))
              (append (cons (car L) (retire (cdr L) e)) e))
          (cdr L)
          )
      (list) 
      )
    )
    avec la dernière parenthèse qui indique une erreur.
    À mon avis, tu devrais commencer par le début de ton cours.
    Tu ne maîtrises pas les listes. Tu ne peux pas réussir les exercices sur les fonctions récursives. N'as-tu jamais vu ça dans un cours d'info ?

  20. #20
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 59
    Points : 17
    Points
    17
    Par défaut
    garulfo si si la plupart des exercices j'arrive à les faire mais quand ça bloque ça bloque , donc après réflexion j'ai trouvé , voici mon résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    (define (retire L e)
      (if (pair? L)
          (if (not (= (car L) e))
              (cons (car L) (retire (cdr L) e))
              (cdr L)
              )
          (list) 
          )
      )
    j'ai bien regardé avec le debug de mon logiciel les etapes de l'exécution de la fonction et je pense avoir compris , merci beaucoup à tous pour votre soutien .

Discussions similaires

  1. [XL-2010] Renvoyer une liste sans les doublons
    Par beabianchini dans le forum Excel
    Réponses: 8
    Dernier message: 24/06/2015, 22h26
  2. Selection à partir d'une liste et renvoyant une liste
    Par Thebaloo dans le forum Requêtes
    Réponses: 10
    Dernier message: 20/12/2012, 10h47
  3. Réponses: 2
    Dernier message: 21/07/2010, 12h30
  4. Réponses: 7
    Dernier message: 05/10/2006, 08h07
  5. Réponses: 2
    Dernier message: 30/06/2006, 16h46

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