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

Scheme Discussion :

Syntaxe avec un if et de la récursivité


Sujet :

Scheme

  1. #1
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut Syntaxe avec un if et de la récursivité
    Bonjour , j'ai essayé d'écrire un programme qui prend un nombre en paramètre et qui le renvoit en binaire .

    Voici mon algorithme en français , à partir d'un exemple :

    prenons le chiffre 12 .

    12/2 = 6 >> (quotient 12 2) (modulo 12 2)
    6/2 = 3 >> >> (quotient 6 2) (modulo 6 2)
    3/2 = 1 , reste 1 >> (quotient 3 2) (modulo 3 2)
    1/2 = 0 reste 1 >> (quotient 1 2) (modulo 1 2)

    Donc je dois utiliser une fonction récurisve pour ça qui m'affiche 1 si le modulo de n 2 vaut 0 et qui m'affiche 0 si le modulo ne vaut pas 0 .

    voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    (define (base n)
      (if (= n 0)
          0
          (base (quotient n 2))
          (if (= (modulo n 2) 0)
              1
              0)))
    1.La fonction prend un seul paramètre , n , là vous etes d'accord je pense .
    2. si n = 0 on renvoit 0 c'est logique , 0 en base 2 ça fait 0 , donc c'est la 1ere condition .
    3.je crée ma fonction récursive qui tant que n n'est pas égal ) 0 vaut quotient n 2 , normal , on a 12 , 6 , 3 , 1 .
    Et je dis bien que si le modulo est égal à 0 on affiche 1 , sinon on affiche 0.

    J'ai juste un soucis c'est à la compilation j'ai ce message :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if: bad syntax (has 4 parts after keyword) in: (if (= n 0) 0 (decimal-binaire (quotient n 2)) (if (= (modulo n 2) 0) 1 0))
    c'est la 1ere fois que je vois ça , qu'est ce qui ne va pas , on a pas le droit de mettre 4 parties dans un if ?

    merci de votre soutient .

  2. #2
    Membre éclairé
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Points : 803
    Points
    803
    Par défaut
    Non, un if a trois parties:
    • La condition
    • La clause then
    • La clause else

    Pas une de plus.

  3. #3
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut
    oui mais ici j'ai plusieurs conditions d'après mon algo :

    si n = 0 , on affiche 0 , mais ensuite faut que j'appelle ma fonction récursive et que je dise un autre si : si modulo = 0 ...

    donc comment je peux faire ici ? car mon algo est juste...

  4. #4
    Membre éclairé
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Points : 803
    Points
    803
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (if (con1)
        then1
        (if (cond2)
            then2
            else-clause))
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    (cond (cond1 then1)
          (cond2 then2)
          (else else-clause))

  5. #5
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut
    j'ai résolu le if mais j'ai tjs ce probleme avec le let pourtant j'ai bien suivi les règles de grammaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    (define (base n m)
      (if (= n 0)
          0
          (if (= (modulo n 2) 0)
              (let ((m (quotient n 2))
              (base (- n m))))
              1)))
    pas possible ça

  6. #6
    Membre éclairé
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Points : 803
    Points
    803
    Par défaut
    Prends un papier, un crayon et fais le parcours toi-même. Aussi, t'as un problème dans ton let.

  7. #7
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut
    mais le let a bien un corps ici et j'ai déjà pris le papier et le crayon , je ne vois pas ce qui ne va pas ...

  8. #8
    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 GnuVince Voir le message
    Prends un papier, un crayon et fais le parcours toi-même. Aussi, t'as un problème dans ton let.
    Ce conseil vaut de l'or.
    Un des avantages de Scheme (des langages fonctionnels en général) est que le modèle de calcul est très simple.

  9. #9
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut
    garulfo je me suis cassée la tete à trouver l'algorithme , j'ai fait plusieurs d'essai de traductions en scheme , j'aimerais des commentaires sur mon code scheme si ça t'ennuit pas car je galère depuis 2 jours sur ça et je n'avance pas...

  10. #10
    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 Maxence45 Voir le message
    garulfo je me suis cassée la tete à trouver l'algorithme , j'ai fait plusieurs d'essai de traductions en scheme , j'aimerais des commentaires sur mon code scheme si ça t'ennuit pas car je galère depuis 2 jours sur ça et je n'avance pas...
    En fait je pense qu'il te manque beaucoup de connaissance sur Scheme pour comprendre l'évaluation -_-

    Ici ton problème est encore un problème probablement d'inattention.
    Encore une fois, réécrit complètement ton code avec des [] des {} et des () pour t'aider, penses à passer des lignes pour produire un code qui ressemble à ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    (define (base n m)
      (if (= n 0)
          0
          (if (= (modulo n 2) 0)
              (let ((m (quotient n 2))
                    (base (- n m))
                    )
                )
              1
              )
          )
      )
    Tu as la possibilité de réindenter tout ton code à l'aide de ctrl-I ça pourrait t'aider. N'hésites pas à le faire régulièrement.
    Sers toi de ta souris pour lire les blocs (les zones surgrisées). Ça t'aidera à repérer des erreurs de syntaxes. Ici par exemple, si tu places ta souris à la parenthèse juste avant le let tu vois le corps complet du let qui apparait clairement (ici je le fais apparaitre en rouge)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    (define (base n m)
      (if (= n 0)
          0
          (if (= (modulo n 2) 0)
              (let ((m (quotient n 2))
                    (base (- n m))
                    )
                )
              1
              )
          )
      )
    Tu n'as pas de corps à ton let... c'est une erreur que tu as déjà fait non ?

  11. #11
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut
    alors j'ai résolu le probleme du let mais il en vient un autre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    (define (base n)
      (if (= n 0)
          0
          (if (= (modulo n 2) 0)
              (let ((m (quotient n 2))
                    (base (- n m))
                    )
                1
                )
              )
          )
      )
    reference to undefined identifier: m

    je vais jamais yarriver je commence à me décourager

  12. #12
    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 Maxence45 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    (define (base n)
      (if (= n 0)
          0
          (if (= (modulo n 2) 0)
              (let ((m (quotient n 2))
                    (base (- n m))
                    )
                1
                )
              )
          )
      )
    reference to undefined identifier: m
    C'est parce que tu as utilisé let. Ce que tu veux ici c'est let*.
    En effet, les liaisons créées par le let ne sont pas visibles dans les autres liaisons que tu es entrain de définir. Le let* autorise ça par contre.

  13. #13
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut
    ok , alors ici pour le nombre 12 ça me renvoit 1 , au lieu de me renvoyer 1100 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    (define (base n)
      (if (= n 0)
          0
          (if (= (modulo n 2) 0)
              (let* ((m (quotient n 2))
                    (base (- n m))
                    )
                1
                )
              )
          )
      )
    bizarre que ma fonction ne continue pas ...

  14. #14
    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 Maxence45 Voir le message
    ok , alors ici pour le nombre 12 ça me renvoit 1 , au lieu de me renvoyer 1100 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    (define (base n)
      (if (= n 0)
          0
          (if (= (modulo n 2) 0)
              (let* ((m (quotient n 2))
                    (base (- n m))
                    )
                1
                )
              )
          )
      )
    bizarre que ma fonction ne continue pas ...
    Ça c'est un autre problème... comme je te l'ai dit ton let à un problème.
    Laissons les joies de la couleur illuminer ce problème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    (define (base n)
      (if (= n 0)
          0
          (if (= (modulo n 2) 0)
              (let* ((m (quotient n 2))
                    (base (- n m))
                    )
                1
                )
              )
          )
      )
    • en bleu, le mot clé.
    • en marron, les parenthèses qui renferment le let
    • en vert les parenthèses entourant les liaisons (couple identificateur-expression),
    • en rouge le corps de ton let

    La on voit que (base (- n m)) n'est pas le corps de let, mais une liaison que tu crées. Tu redéfinis donc localement base comme étant (- n m). Mais tu renvois 1.
    Ça merde donc

  15. #15
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut
    meme si je change le base de place ça change pas grand chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    (define (base n)
      (if (= n 0)
          0
          (if (= (modulo n 2) 0)
              (let* ((m (quotient n 2))
                    )
                 (base (- n m))
                1
                )
              )
          )
      )
    je crois que le probleme vient carrément du if modulo n 2...

  16. #16
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut
    je vais radicalement changer mon code celui là c'est du n'importe quoi .

  17. #17
    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 Maxence45 Voir le message
    meme si je change le base de place ça change pas grand chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    (define (base n)
      (if (= n 0)
          0
          (if (= (modulo n 2) 0)
              (let* ((m (quotient n 2))
                    )
                 (base (- n m))
                1
                )
              )
          )
      )
    je crois que le probleme vient carrément du if modulo n 2...
    maintenant tu as un autre problème...
    Ton let* possède deux corps.
    Tu dois te servir du highlight de l'éditeur pour corriger ce genre de chose, le temps que ton oeil s'habitue.

    Avec CTRL-I on voit que (base (- n m_)) s'aligne avec 1.
    Et regarde l'image qui suit... ça montre la portée du let*, j'ai place mon curseur avant la parenthèse du let*.

  18. #18
    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 Maxence45 Voir le message
    je vais radicalement changer mon code celui là c'est du n'importe quoi .
    Tout réécrire serait peut être une bonne solution
    Quand je reviens (qqs heures) si tu n'as pas trouvé je te donnerais ta solution.

  19. #19
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut
    je suis en france et toi au canada , ne me donne pas la solution tte faite , mais là j'ai un code sans erreur de syntaxe , ni d'erreur de if ni rien mais il fait planter mon ordi , je te le commente à ma manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    (define (base n)
      (if (= n 0)
          0
              (let* ((m (quotient n 2))
                    )
                 (base (- n m))
                (if (= (modulo n 2) 0)
                1
                0)
                )
        )
      )
    1.si n = 0 , on affiche bien 0 , normal .

    2.avec mon let je fais bien la liaison entre m et quotient n 2 .

    3.Ensuite je dis calcule quotient n 2 avec le "(base (- n m)) , c'est ma fonction récursive .

    4. et si le modulo de n 2 vaut 0 alors j'affiche 1 .

    mais rien ne se passe ...

  20. #20
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut
    nan ce code c'est n'importe quoi , donc en français je dois traduire :

    si n = 0 on affiche 0 , ça c'est fait , mais ensuite je dois traduire :

    sinon on divise n par 2 et si le modulo de n par 2 vaut 0 alors on affiche 1 , sinon on affiche 0 .

    juste une question là et ça me permettra d'avancer : je dois me taper combien de if pour traduire mon algo en scheme ?

    merci

Discussions similaires

  1. Erreur de syntaxe avec UPDATE
    Par tyarak dans le forum Requêtes
    Réponses: 3
    Dernier message: 01/02/2006, 01h18
  2. pb de syntaxe avec le "select"
    Par dipajero dans le forum Bibliothèques tierces
    Réponses: 5
    Dernier message: 04/01/2006, 15h40
  3. syntaxe avec un if
    Par cubepiege dans le forum Langage SQL
    Réponses: 17
    Dernier message: 07/11/2005, 18h41
  4. [Tableaux] simple syntaxe avec $_REQUEST
    Par nicerico dans le forum Langage
    Réponses: 3
    Dernier message: 18/10/2005, 16h01
  5. [langage] Pb de syntaxe avec GOTO
    Par BEAUJAULT dans le forum Langage
    Réponses: 2
    Dernier message: 14/10/2004, 16h02

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