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

Lisp Discussion :

[Lisp][Débutant] Eviter une récursivité inutile


Sujet :

Lisp

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 271
    Par défaut [Lisp][Débutant] Eviter une récursivité inutile
    Bonjour,

    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    (define (sac-a-dos p l) 
      ( calcul p (constree l) (car (constree l) ) ) )
    Constree construit un nouvel arbre. Mais cet arbre est genéré deux fois
    Y a t il un moyen d eviter la deuxieme recursivite sans utiliser de variable ou stocker la liste (contraintes d ecole) ?

    Merci

  2. #2
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    sans variable... je ne pense pas


    ps: c'est d'ailleurs ce genre de profs qui transforment l'algo d'exponentiation rapide (en Ln n) en une exponentielle stupide (en n Ln n), sachant que la méthode native est en n
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  3. #3
    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
    Par défaut
    Citation Envoyé par Treuze
    Bonjour,

    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    (define (sac-a-dos p l) 
      ( calcul p (constree l) (car (constree l) ) ) )
    Constree construit un nouvel arbre. Mais cet arbre est genéré deux fois
    Y a t il un moyen d eviter la deuxieme recursivite sans utiliser de variable ou stocker la liste (contraintes d ecole) ?

    Merci
    Tu ne peux pas utiliser un let ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    (define (sac-a-dos p l) 
      (let ((cl (constree l)))
        ( calcul p cl  (car cl ) ) ))
    Y a peut-être un problème de parenthèse mais l'idée c'est ça.

    Comment est écrit calcul ?
    "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

  4. #4
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 271
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    (define (calcul p l lro )
      (cond ((null? (car l)) lro)
            (else  
                 ( calcul p (cdr l) (add p (car l) (car l) (addr lro) lro)  ) ) ) )
    Comment marche un let au niveau memoire ? Il enregistre le resultat de la fonction ?

    "addr" fait l additon des termes d une A-liste

  5. #5
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    sinon tu fais une fonction intermédiaire...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    (define (inter_sac-a-dos p cl)
      (calcul p cl  (car cl )))
     
    (define (sac-a-dos p l) 
      ( inter_sac-a-dos p (constree l) ))
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  6. #6
    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
    Par défaut
    Le let crée une liaison à l'intérieur de la fonction, la variable est locale à la fonction.
    "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

  7. #7
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 271
    Par défaut
    Merci j ai opté pour la fonction intermediaire, ca m evitera de chercher l equivalent du Let en Lisp emacs...

    C est bien les contraitnes d ecole comme si en entreprise mon patron allait me dire "faites un logiciel performant mais attention, n utilisez pas toutes les fonctionnalités du langage ..."

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

Discussions similaires

  1. Eviter une syntaxe trompeuse.
    Par Mersenne dans le forum C++
    Réponses: 24
    Dernier message: 09/07/2006, 14h27
  2. [Formulaire] eviter une revalidation
    Par eleve36 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 28/10/2005, 11h29
  3. [DB2] Eviter une cascade infini dans un trigger
    Par Fatah93 dans le forum DB2
    Réponses: 2
    Dernier message: 25/04/2005, 14h23
  4. [Lisp] Suppression des parenthèses dans une liste
    Par bourdaillet dans le forum Lisp
    Réponses: 3
    Dernier message: 19/12/2004, 21h02
  5. Réponses: 2
    Dernier message: 21/06/2004, 15h55

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