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 :

Conditions - incompréhensions


Sujet :

Lisp

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 109
    Points : 143
    Points
    143
    Par défaut Conditions - incompréhensions
    Bonjour à tous !

    Voilà dans mon cours j'ai un exemple de fonction qui est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    (defun ensemble (liste)
        (cond
            ((null liste) t)
            ((member (car liste) (cdr liste)) ())
            (t (ensemble (cdr liste) ) )
        )
    )
    Et donc apparemment cette fonction teste si une liste est un ensemble (pas de doublons).

    Quand on fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ensemble '(a b c d e f g)
    Ca m'affiche t

    Et quand on fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ensemble '(1 2 (1 2 3) 2 (3 4))
    Ca m'affiche NIL ou ()...

    Bref il y a UN truc que j'arrive pas à saisir, c'est ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        (cond
            ((null liste) t)
    On va tester une première condition qui est de savoir si la liste passée en paramètre est nulle... Pourtant dans le premier cas, la liste n'est pas nulle (à moins qu'une liste sans doublons est considérée comme une liste nulle)...




    Et il y a un autre exemple qui me turlupine c'est celui là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    (defun member (x liste)
    	(cond
    		((null liste) ())
    		((equal (car liste) x) liste)
    		(t (member x (cdr liste) ) )
    	)
    )
    C'est une fonction qui teste si un élément est présent dans une liste

    Quand on fait :

    ça affiche (a f g)

    Et quand on fait :

    ça affiche ()

    Donc là c'est à peu près le même genre d'incompréhension, il teste une première fois si la liste est nulle, mais elle n'est jamais nulle oO.. enfin il n'est pas censé savoir que l'élement passé en premier paramètre ne se trouve pas dans la liste avoir d'être passé dans les autres tests... Donc je comprend vraiment pas là je suis un peu perdu :/

  2. #2
    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 MeTaLCaM Voir le message
    Bonjour à tous !

    Voilà dans mon cours j'ai un exemple de fonction qui est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    (defun ensemble (liste)
        (cond
            ((null liste) t)
            ((member (car liste) (cdr liste)) ())
            (t (ensemble (cdr liste) ) )
        )
    )
    Et donc apparemment cette fonction teste si une liste est un ensemble (pas de doublons).
    Exact… au   près

    Citation Envoyé par MeTaLCaM Voir le message
    [...]
    Bref il y a UN truc que j'arrive pas à saisir, c'est ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        (cond
            ((null liste) t)
    On va tester une première condition qui est de savoir si la liste passée en paramètre est nulle... Pourtant dans le premier cas, la liste n'est pas nulle (à moins qu'une liste sans doublons est considérée comme une liste nulle)...
    Mais où est-ce un problème ? La première condition n'est pas valide, donc il passe à la seconde. Celle-ci ne l'est pas donc il passe au cas par défaut. Cette fois-ci la condition est trivialement vraie donc on applique l'appel récursif. Si tu n'as pas compris ça il faut revoir la partie sur la récursivité.

    Finalement c'est l'algorithme que tu ne comprends pas.


    Citation Envoyé par MeTaLCaM Voir le message
    [...]
    Donc là c'est à peu près le même genre d'incompréhension, il teste une première fois si la liste est nulle, mais elle n'est jamais nulle oO.. [...]Donc je comprend vraiment pas là je suis un peu perdu :/
    Il y a aussi un appel récursif. Si la fonction est appelé avec un paramètre non vide tu pourras remarquer qu'un des appels à venir finira par remplir la première ou la deuxième clause (cas de base de la récursivité).

    Je pense vraiment que tu as un problème à comprendre un algorithme récursif et non une implémentation en Lisp.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 109
    Points : 143
    Points
    143
    Par défaut
    Je viens de comprendre en fait... L'instruction avec null est vraie tout à la fin, une fois que la liste est belle est bien vide puisqu'on en enlève un bout à chaque passage (appel récursif)... C'est ça que j'avais pas saisi.

    Merci en tout cas

  4. #4
    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 MeTaLCaM Voir le message
    Je viens de comprendre en fait... L'instruction avec null est vraie tout à la fin, une fois que la liste est belle est bien vide puisqu'on en enlève un bout à chaque passage (appel récursif)... C'est ça que j'avais pas saisi.

    Merci en tout cas
    Tout à fait. Félicitations.

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

Discussions similaires

  1. Bug incompréhensible dans une condition while
    Par Runawaycl dans le forum Scilab
    Réponses: 2
    Dernier message: 15/05/2014, 21h10
  2. Erreur incompréhensible avec une condition if et une requête SQL
    Par Francky44003 dans le forum Bases de données
    Réponses: 6
    Dernier message: 16/04/2011, 17h09
  3. Réponses: 1
    Dernier message: 04/12/2006, 07h55
  4. [WSAD5] probleme incompréhensible
    Par capitaine_banane dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 07/04/2004, 11h56
  5. boucle avec condition d'arret changeante
    Par NicoH dans le forum Langage
    Réponses: 3
    Dernier message: 10/06/2003, 11h48

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