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 :

Récursivité sur les listes : problème d'expression


Sujet :

Scheme

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 17
    Points : 14
    Points
    14
    Par défaut Récursivité sur les listes : problème d'expression
    Bonjour, je suis en L1MI et je commence la programmation en Scheme, et je bute sur cet exercice qui porte sur le thème de la récursivité sur les listes.

    Spécifier et écrire une fonction construire qui, étant donné une liste, retourne l'expression premettant de la construire en utilisant uniquement cons, les éléments atomiques et la liste vide.
    Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >(construire '(a b))
    (cons a (cons b '()))
    
    >(construire '((a b) c))
    (cons (cons a (cons b ())) (cons ()))

    Mon ébauche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    (define construire
      (lambda (l)
        (if (= (lenght l) 1)
            (car (cons '(cons (car l) ()) ()))
             .
             .
             .
    Mais le probléme c'est que (car l) n'est pas exécuté et sa me donne quelque chose du genre:

    (cons (car l) ())
    quand c'est exécuté pour une liste composé d'un seul élément.

    Si vous avez une piste??

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Il faut que tu utilises la récursivité sans t'occuper de la longueur de la chaîne
    Tu as trois cas
    • la liste est vide
    • le premier élément de la liste est lui-même une liste
    • le premier élément est un atome.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Membre émérite

    Homme Profil pro
    Inscrit en
    Juillet 2003
    Messages
    2 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 2 075
    Points : 2 844
    Points
    2 844
    Par défaut
    Salut
    La récursivité ça s'apprend (durement!). En fait il te faut un cas de base ( ici tu utilises length) et le cas général (qui par définition est différent du cas de base).
    En général tu utilises une structure conditionnelle pour borner ta récursion. Tu as donc la structure classique du if:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (if <cond> <consequence> <alternant>)
    Il est essentiel de bien la comprendre pour éviter par exemple d'inverser alternant et conséquent () ou pire encore mélanger les deux...
    Ici si l'on définit ton problème, on t'offre une liste citée d'un certain nombre d'éléments d'un certain type citée et ça doit rendre une liste avec les cons apparents.
    Le raisonnement est simple: si tu as bien une liste en entrée, il te faut mettre un cons devant son car, puis un autre devant le car du reste de la liste et ainsi de suite.
    Cela amène un schéma récursif classique:
    (define (ma_jolie_fonction L) ;; L comme Liste
    (if (pair? L)
    (combinaison (car L)
    (ma_jolie_fonction (cdr L)))
    0)) ;; ne jamais oublier le cas de base sinon ça foire!
    Donc ça devrait donner un code (non-testé!!)du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (define (construire L)
      (if (pair? L)
       (append(list 'cons (car L) ''())
              (construire (cdr L)))
      0))
    Tu devrais réfléchir à ce que tu as en entrée, ce que tu veux en sortie et la façon d'interagir avec les données en entrée pour obtenir la sortie voulue

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Tu n'en n'étais pas loins !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (define (construire L)
      (if (pair? L)
       (cons 'cons (cons (construire (car L)) (cons (construire (cdr L)) '()))) 
       L))
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  5. #5
    Membre émérite

    Homme Profil pro
    Inscrit en
    Juillet 2003
    Messages
    2 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 2 075
    Points : 2 844
    Points
    2 844
    Par défaut
    Citation Envoyé par Trap D
    Tu n'en n'étais pas loins !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (define (construire L)
      (if (pair? L)
       (cons 'cons (cons (construire (car L)) (cons (construire (cdr L)) '()))) 
       L))
    Ce code est effectivement plus intéressant pour le simple fait qu'il utilise cons dont l'usage est sans aucun doute plus judicieux ici que append + list.
    Donc en effet au niveau efficacité et concision c'est nettement mieux. L'alternative aussi. Par défaut je mets toujours 0, cela me permet de vérifier les erreurs (qud je vois 0 a mon prompt, je sais que y'a erreur dans mon traitement).
    Enfin le but ici n'était pas de donner la meilleure solution mais simplement de retracer le raisonnement qui doit être fait pour résoudre un problème via un langage de programmation, le reste, c'est de la syntaxe: il "suffit" de lire les bons livres pour s'en sortir alors que ça n'est pas dans les livres que l'on apprend à résoudre des problèmes, c'est en s'y confrontant et en étant capable d'une part de comprdre le raisonnement et ensuite de le reproduire.
    En tout les cas, merci pour les corrections

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [BOXIR3]Problème sur les listes de valeur
    Par bablight dans le forum Designer
    Réponses: 0
    Dernier message: 01/07/2015, 11h25
  2. Problème sur les listes
    Par scary dans le forum Prolog
    Réponses: 11
    Dernier message: 31/03/2010, 08h17
  3. petit problème sur les listes chaînées
    Par poche dans le forum C
    Réponses: 14
    Dernier message: 19/03/2007, 16h53
  4. Problème sur les listes doublement chainée
    Par Traouspont dans le forum C
    Réponses: 5
    Dernier message: 05/01/2007, 12h02
  5. Précisions sur les listes
    Par Virgile59 dans le forum Access
    Réponses: 1
    Dernier message: 07/02/2006, 21h20

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