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 :

[CLisp] - Fonction Position


Sujet :

Lisp

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Avril 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2015
    Messages : 16
    Points : 9
    Points
    9
    Par défaut [CLisp] - Fonction Position
    Bonjour, je voudrais faire une fonction comme la fonction prédéfinie position.
    J'ai fais une fonction itérative :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    (defun position (x lst)
      (when (consp lst)
        (loop for c in lst for i from 0
          when (equal c x) return i)))
    Maintenant j'essaye de refaire cette fonction de façon a ce qu'elle soit récursive, mais je ne vois pas trop comment.

  2. #2
    Futur Membre du Club
    Femme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Avril 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2015
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    J'ai tenté avec ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (defun position (x lst)
      (cond
        ((atom lst) nil)
        ((equal (car lst) x) 0)
        ((null (car lst)) (posi x))
        (t (1+ (posi x (cdr lst)))) ) )
    Elle fonctionne tant que la fonction ne tombe pas sur un nil
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    (posit 'd '(a b c d e f)
    3
    (posi 'y '(a b c d e f)
    nil is not a number
    Sauf que je ne peux pas changer le nil de (atom list) sinon le nil est compter.

  3. #3
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    D'abord, dans ta fonction position il est fait appel à la fonction "posi": est-ce volontaire, une erreur de frappe?

    Ensuite, il faut que tu partes de la spécification de la fonction: qu'est ce que ta fonction est censée faire si on lui fournit des arguments corrects, et que doit elle faire si on lui fournit des arguments incorrects?

    Pour la première partie, quand les arguments sont corrects, la fonction doit retourner nil si l'élément n'est pas présent, et l'index de l'élément s'il est présent. L'élément est absent si on est arrivé à la fin de la liste, c'est-à-dire que la liste est vide = Nil

    Donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (defun pos (x lst)
      (cond
        ((null lst) nil) ;; on est arrivé à la fin de la liste
        ((equal (car lst) x) 0) ;; on est arrivé à l'élément recherché
        (T (1+ (pos x (cdr lst)))))) ;; sinon on va un élément plus loin
    Pour la gestion d'erreur, à toi de jouer.

  4. #4
    Futur Membre du Club
    Femme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Avril 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2015
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    Bonjour et merci pour la réponse

    En effet pour posi et position, c'est des erreurs de frappes j’étais sur mon téléphone

    Ma fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (defun position (x lst)
      (cond
        ((atom lst) nil)
        ((equal (car lst) x) 0)
        ((null (car lst)) (posi x))
        (t (1+ (position x (cdr lst)))) ) )
    et ta fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (defun pos (x lst)
      (cond
        ((null lst) nil)
        ((equal (car lst) x) 0)
        (T (1+ (pos x (cdr lst))))))
    fonctionnent toutes les deux et donnent le même résultat sauf pour les erreurs comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (pos 'x '(c d e f a b))
    - 1+: NIL is not a number
    Moi je cherche a savoir comment faire pour éviter cette erreur :/

  5. #5
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    Exact!

    Il faut modifier la fonction de la façon suivante, pour éviter (1+ Nil):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (defun pos (x lst)
      (cond
        ((null lst) nil)
        ((equal (car lst) x) 0)
        (T (let ((nxt (pos x (cdr lst))))
              (when nxt (1+ nxt)))))

  6. #6
    Futur Membre du Club
    Femme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Avril 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2015
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    Merci stendhal666 !

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2015
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Bonjour, est ce qu'il serait possible de refaire cette même fonction mais sans When ou let ?

  8. #8
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    Oui mais pourquoi?

    Pour when, c'est facile, tu peux le remplacer par if. On utilise when quand on ne met pas d'expression à exécuter si la condition est fausse (if then else / when then). when X Z est équivalent à if X Z nil.

    Pour let, il est possible de répéter l'expression qui y est définie mais c'est moins élégant et moins efficace (elle sera évaluée deux fois).

  9. #9
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2015
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Parce j'aime me casser la tête

    Ainsi la fonction deviendrait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    (defun pos (x lst)
      (cond
        ((null lst) nil)
        ((equal (car lst) x) 0)
        (T (let ((nxt (pos x (cdr lst))))
              (if (nxt t) :
                  (1+ nxt)))))
    Et pour le let je vois pas trop tu pourrais m'expliquer ?

    Merci!

  10. #10
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2015
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Personne ? :/

  11. #11
    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
    Quelle est donc ta question ?

    L'algorithme est suivant:
    1) si la laste est vide, renvoyer NIL (l'objet n'est pas été trouvé);
    2) si la liste n'est pas vide et en le premier élément équivaut à l'objet donné, renvoyer 1;
    3) si la liste n'est pas vide et en le primier élément n'équivaut pas à l'objet donné, trouver la position de l'object dans le reste de la liste;
    4) si l'objet n'est pas été trouvé, renvoyer NIL;
    5) autrement renvoyer sa position dans le reste de la liste plus 1.

    Ainsi, ayant trouvé la position de l'élément dans le reste de la liste, faut-il la garder pour la tester et pour l'augmenter ensuite.

    De toute façon, tu as des erreurs syntaxiques. Tout d'abord, qu'est-ce que sont que ces deux-points ? Ensuite, en écrivant (nxt t) tu veux appliquer la fonction nxt à la valeur t, ce qui n'a pas de sens. La forme (if <expr1> <expr2> <expr3>) teste si <expr1> est NIL ou pas et évalue l'une des expressions suivantes, alors dans ce cas il suffit écrire simplement (if nxt ...).

  12. #12
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2015
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Bonjour et merci d'avance,

    Ma question est que je voudrais re-ecrire cette fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (defun pos (x lst)
      (cond
        ((null lst) nil)
        ((equal (car lst) x) 0)
        (T (let ((nxt (pos x (cdr lst))))
              (when nxt (1+ nxt)))))
    Mais sans When et let...Mais je n'y arrive pas

  13. #13
    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
    Bien, est-ce que tu peux formuler un algorithme sans branchement ? Moi, je ne le peux pas, mais on peut masquer WHEN/IF comme une branche du COND. Quant'à LET, on peut l'éliminer en le remplacant avec l'expression même (alors que la complexité devient exponentielle au lieu de lineaire). Alors, on obtient ce code affreux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (defun pos (x list)
      (cond ((null list) nil)
            ((equal (first list) x) 0)
            ((pos x (rest list)) (1+ (pos x (rest list))))
            (t nil)))

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 35
    Points : 63
    Points
    63
    Par défaut
    Bonjour LittleGeeky,

    Remplace ton let par la fonction anonyme lambda, et ton when par un if
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (defun pos (x lst)
      (cond ((null lst) nil)
            ((equal (car lst) x) 0)
            (T ((lambda (i) (if i (1+ i)))
               (pos x (cdr lst))))))
    A+

Discussions similaires

  1. fonction position dans Essbase
    Par dadou2555 dans le forum EPM (Hyperion)
    Réponses: 0
    Dernier message: 15/09/2013, 17h02
  2. [XSLT 1.0] XSLT: utilisation de la fonction position() dans <for-each> imbriqués
    Par bernidupont dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 04/05/2011, 21h33
  3. [VBA]connaitre valeur en fonction position souris
    Par cbleas dans le forum VBA Access
    Réponses: 6
    Dernier message: 23/04/2007, 19h35
  4. [XSLT] fonction position()
    Par Raumfahrerralf dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 19/03/2007, 18h01
  5. [XSLT] [PHP 5] fonction position()
    Par sharper dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 01/12/2005, 12h58

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