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 :

Pb fonction récursive simple


Sujet :

Lisp

  1. #1
    Membre du Club
    Profil pro
    ceo
    Inscrit en
    Août 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ceo

    Informations forums :
    Inscription : Août 2005
    Messages : 62
    Points : 48
    Points
    48
    Par défaut Pb fonction récursive simple
    Bonjour,

    j'ai un petit problème avec la fonction suivante qui enlève les chaînes vides dune liste, elle fonctionne mais quand le premier élément est une chaîne vide elle renvoie la bonne liste mais ce premier élément reste (la liste n'est aps modifiée) :

    ceci sera certainement plus clair :

    (setq a '("" "b" "c" ""))
    (arrange a) => ("b" "c")
    a => ("" "b" "c")

    Et la fonction arrange :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    (defun arrange (liste) 
      (setq L (length (car liste)))
      (cond
        ((atom liste) liste)     
        ((> L 0) (rplacd liste (arrange (cdr liste)))) 
        (t (arrange (cdr liste))) ) )
    Merci d'avance.

  2. #2
    Membre actif
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 152
    Points : 275
    Points
    275
    Par défaut
    Bonjour !

    Si tu passes une liste de longeur positif à ta fonction, elle ne fait que changer sa cdr-partie, c'est-à-dire elle ne fait rien avec son premier élément.

    En effet tu as défini une fonction destructive, qui change (= détruit, du point de vue de la programmation fonctionelle) son argument. On peut se servir de telles fonctions seulement quant'on n'ont plus besoin de l'argument. Mais regarde:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CL-USER> (defvar *a* '("asdf" "" "jkl"))
    *A*
    CL-USER> (let ((b *a*))
               (arrange b))
    ("asdf" "jkl")
    CL-USER> *a*
    ("asdf" "jkl")
    Ainsi la valeur de *a* est-elle changé, ce qui est peut-être inattendu et indésirable. En effet, la variable b se rapporte à la même liste que *a*, pas à une copie de celle-ci.

    Si tu veux une fonction pûre, tu peux écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    (defun arrange (lst)
      (cond ((atom lst) lst)
            ((null lst) nil)
            (t (let ((head (first lst))
                     (tail (rest lst)))
                 (if (equal head "")
                     (arrange tail)
                     (cons head (arrange tail)))))))
    Fais attention qu'il n'y a aucune affectation, ce qui est caractéristique de la programmation fonctionelle. En Lisp on emploie l'affectation de temps en temps, mais pas souvent. En d'autres termes, on introduit souvent des « bindings », c'est-à-dire des nouveaux notations, mais on ne change les « bindings » existants qu'à contrecœur.

    Mais celle implémentation-là n'est pas très efficace, car la récursion n'est pas terminale.

    Naturellement, on peut aussi se servir d'une fonction standarde:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CL-USER> (remove "" '("" "asdf" "" "jkl") :test #'equal)
    ("asdf" "jkl")

Discussions similaires

  1. Problème sur fonction récursive simple
    Par zarohn dans le forum Débuter avec Java
    Réponses: 14
    Dernier message: 18/03/2010, 11h41
  2. Fonction pair simple
    Par mh_02 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 30/12/2005, 22h35
  3. Fonction récursive renvoi sur page d'erreur
    Par peck dans le forum Langage
    Réponses: 1
    Dernier message: 23/12/2005, 10h08
  4. 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
  5. creation d'une procedure ou fonction toute simple?
    Par atlas2003 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 16/11/2005, 14h56

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