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 :

fonction qui repère n fois


Sujet :

Lisp

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 208
    Par défaut fonction qui repère n fois
    Bonsoir,

    Je bloque pour écrire une fonction qui repère combien de fois une chaîne est inclue dans une autre.

    (string-contain 'ark' 'abbbe) => 0
    (stringcontain 'ark' 'ddarkdark) => 2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (defun string-contain (string1 string2)
      (cond
       ((not (length string1)) nil) ; string1 est vide (pas besoin de le tester à chaque fois)
       ((> (length string1) (length string2)) nil) ; string1 est plus longue que chaine2
       ((string= string1 (subseq string2 0 (length string1))) string1) 
       (t (+ 1(string-contain string1 (subseq string2 1))))))
    Mais le code ne marche pas :s

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *** - +: "ark" is not a number

    Merci

  2. #2
    Membre Expert

    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
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par l1informatique Voir le message
    Bonsoir,

    Je bloque pour écrire une fonction qui repère combien de fois une chaîne est inclue dans une autre.

    (string-contain 'ark' 'abbbe) => 0
    (stringcontain 'ark' 'ddarkdark) => 2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (defun string-contain (string1 string2)
      (cond
       ((not (length string1)) nil) ; string1 est vide (pas besoin de le tester à chaque fois)
       ((> (length string1) (length string2)) nil) ; string1 est plus longue que chaine2
       ((string= string1 (subseq string2 0 (length string1))) string1) 
       (t (+ 1(string-contain string1 (subseq string2 1))))))
    Mais le code ne marche pas :s

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *** - +: "ark" is not a number

    Merci
    C'est normal tu renvoies string1 si elle est trouvée dans string2 et tu lui rajoutes 1 si elle n'est pas trouvée. Mais le problème zst plus grave que ça: la condition 3 devrait être remplacée par 1+ recursion et la 4 par une recursion simple
    Bon lisp!

  3. #3
    Membre très actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 208
    Par défaut
    J'ai refais une autres mais il marche que si il s'agit des mêmes chaines de caractères

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (defun string-contain (string1 string2)
      (cond  
        ((> (length string1) (length string2)) 0)
        ((and (= (length string1) (length string2)) (string= string1 string2)) 1)
        ((string= string1 (subseq string2 0 (length string1)))
        (1+ (string-contain string1 (subseq string2 (length string1))))) (t 0)))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (string-contain "abc" "abcabcabc")
    3
    mais si c'est autres choses non comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (string-contain "abc" "ddabccabcabcdd")
    0

  4. #4
    Membre Expert

    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
    Billets dans le blog
    21
    Par défaut
    tu ne réfléchis pas avant de coder, ce n'est pas bien ;-)

    pour une fonction récursive, il faut un cas 0 et un cas n+1 exprimé à partir de n:

    cas 0: tu l'as bien trouvé, il s'agit de
    (< (length str1) (length str2)) ==> on retourne 0

    cas n+1 = (if (string= str1 (subseq str2 0 (length str1))) (1+ cas-n) cas-n)

    sachant que le cas n est (string-contain str1 (subseq str2 1))

    A toi de mettre tout ça en ordre!

  5. #5
    Membre très actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 208
    Par défaut
    Bonjour,

    J'ai suivi vos conseil mais ça ne marche toujours pas, pourtant ça l'aire logique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (defun string-contain (string1 string2)
      (cond  
        ((> (length string1) (length string2)) 0)
        ((and (= (length string1) (length string2)) (string= string1 string2)) 1)
        ((string= string1 (subseq string2 0 (length string1))) 
        (1+ (string-contain string1 (subseq string2 1)))  (string-contain string1 (subseq string2 1)))))
    merci

  6. #6
    Membre Expert

    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
    Billets dans le blog
    21
    Par défaut
    Dans ton cas, cond n'est pas l'idéal, parce-qu'il y a deux choix successifs et que le deuxième dépend du premier:

    Soit len(str1) < len(str2) et on en a fini,
    soit non et on calcule string-contains str1 subseq(str2, 1) auquel on ajoute:
    soit 1 si str2 commence par str1,
    soit 0

    Un exemple d'implémentation serait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    (defun string-contains (str1 str2)
      (if (> (length str1) (length str2))
          0 ;; on est arrivés à la fin
          (let ((cas_n-1 (string-contains str1 (subseq str2 1)))) ;; on calcule le cas n-1
    	(if (string= str1 (subseq str2 0 (length str1))) ;; et on y ajoute
    	    (1+ cas_n-1) ;; soit 1 si str2 commence par str1
    	    cas_n-1)))) ;; soit 0

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

Discussions similaires

  1. une fonction qui fait le changement de repère
    Par diofilip dans le forum C
    Réponses: 3
    Dernier message: 27/02/2012, 15h15
  2. Réponses: 3
    Dernier message: 14/06/2010, 15h10
  3. Une fonction qui marche 8 fois mais pas 9
    Par Swarley dans le forum Prolog
    Réponses: 1
    Dernier message: 04/12/2008, 10h21
  4. [AJAX] [XMLHttp][IE]Fonction qui ne fonctionne qu'une seule fois
    Par narnou dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 13/07/2007, 11h16
  5. fonction qui s'exécute qu'une seule fois sous Firefox
    Par la.sophe dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 01/03/2006, 10h02

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