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

Caml Discussion :

Récursion carré Caml


Sujet :

Caml

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 47
    Points : 22
    Points
    22
    Par défaut Récursion carré Caml
    Bonjour,
    J'essaye actuellement de mettre en place un algorithme récurrent en caml permettant de tracer les figures ci contre :
    http://img293.imageshack.us/my.php?i...rcursiftn3.jpg

    Merci d'avance pour votre aide !!

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    On peut difficilement t'aider sans voir le travail que tu as fait (ou alors on bosse tout seul, mais ce n'est plus de l'aide, c'est de l'assistanat). Tu nous montres le début de ton travail ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 47
    Points : 22
    Points
    22
    Par défaut
    Biensur ^^' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    type point = int * int ;;
    let (creer_point : int -> int -> point) = function x -> function y -> (x, y);; 
    let (abscisse : point -> int) = function (x, y) -> x ;;
    let (ordonnee : point -> int) = function (x, y) -> y ;;
     
    let tracerCarre a taille =
    	Graphics.set_color Graphics.red;
    	Graphics.fill_rect (abscisse a) (ordonnee a) taille taille;
    ;;
     
    let p = creer_point 0 0;;
     
    let rec carrecursif a taille = if taille <2 then tracercarre a taille else
    begin
    ??
    Je coince ici ^^

    Merci !

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    Si la taille du carré est plus grande que 2, il faut que tu rappelles ta procédure récursive en plusieurs endroits de ton carré (au lieu de le peindre en entier), avec une taille plus petite. Tu as une idée de comment exprimer les coordonnées de ces différents points de rappel en fonction de a et de taille ?


    Remarque sur le code : les fonctions "abcisse" et "ordonnee" existent déjà dans la bibliothèque standard, elles sont nommées "fst" (first, premier champ du couple) et "snd" (second). Par ailleurs tu peux aussi utiliser un motif à la place :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    let tracerCarre (x,y) taille =
            Graphics.set_color Graphics.red;
            Graphics.fill_rect x y taille taille
    Au lieu de nommer la position "a", je la nomme "(x, y)", ce qui a pour effet de la décomposer en un couple, et de nommer le premier élément "x", et l'autre "y".

    Au passage, tu n'es pas obligé de préciser les types de tes fonctions (c'est lourd et si tu veux changer de type, tu dois tout modifier, ce qui n'est pas très pratique), et tu peux imbriquer plusieurs arguments à la suite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    let creer_point x y = (x, y)
    (la fonction creer_point étant, au passage, relativement inutile : "creer_point 0 0" est assez agréablement remplacé par "(0, 0)")

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 47
    Points : 22
    Points
    22
    Par défaut
    Oui, justement c'est la ou je bloque, je ne sais pas du tout par quelles coordonnées je dois commencer la récurrence...

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    Quel que soit le niveau de récursion, la zone globale ressemble à ça :


    Dans le cas du "carré récursif 1", tu dois ne rien faire dans les carrés gris, peindre le carré rouge au milieu, et rappeler la fonction récursivement dans les carrés oranges.

    Maintenant, imagine que la coordonnée de départ de ton carré est "(x, y)", et sa taille "taille". Quelles sont les coordonnées et les tailles des carrés à peindre ou à rappeler ?
    Par exemple, les coordonnées du carré à peindre son "(x+taille/3, y+taille/3)", et sa taille "taille/3". Tu vois pourquoi ? Tu as une idée pour les autres ?

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 47
    Points : 22
    Points
    22
    Par défaut
    J'y réfléchit, je vous tiens au courant

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 47
    Points : 22
    Points
    22
    Par défaut
    Voila l'algorithme que j'en déduis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    let rec carrecursif a taille = if taille <2 then tracerCarre a taille else 
    begin
    let abscisse a=(abscisse a+taille)/3 in
    let ordonnee a=(ordonnee a+taille)/3 in
    let taille=taille/3 in
    carrecursif a taille;
    end;;
    Mais j'obtiens les erreurs suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Warning Y: unused variable ordonnee.
    Warning Y: unused variable abscisse.
    Ou est-ce que j'ai faux ?

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    Pour commencer, le message n'est pas une erreur mais un "warning", donc un avertissement. Le code a bien compilé et tu peux le tester, mais le compilateur a trouvé des choses étranges (des variables inutilisées) et t'en avertis : "c'est bizarre, tu as du te tromper".

    Le code ne veut rien dire. Tu commences par définir de nouvelles variables (qui ont, au passage, le nom de fonctions déjà définies, ce qui est en général une assez mauvaise idée), puis tu ne t'en sers pas puisque tu rappelles ta fonction avec l'ancien argument a. Relis ton code calmement et tu verras qu'il n'est pas correct, "let abcisse a = ..." ne redéfinissant en rien la variable a.

    Ensuite, même s'il voulait dire quelque chose il ne serait certainement pas correct, vu qu'à chaque étape de récursion tu dois :
    - peindre le carré central
    - rappeler la fonction sur les 4 carrés extérieurs

    Tu n'as fait qu'un seul appel récursif au lieu de 4, et aucun ordre de peinture.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 47
    Points : 22
    Points
    22
    Par défaut
    Je vais essayer d'exposer mon problème plus clairement :
    Mon idée est la suivant (pour la deuxième figure)
    Je définis les 4 carrés du coin:
    a (x,y)
    b (x, 2*taille)
    c (2*taille,y)
    d (2*taille,2*taille)
    ensuite je veux définir taille=taille/3 et rappeler les 4 fonction récursives;
    Problème: Je ne sais pas comment définir les 4 carrés a b c d dans ma fonction...

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    Les coordonnées ne sont pas bonnes, elles dépendent toutes de x _et_ de y. Par exemple, celles du carrés central sont (x + taille/3, y + taille/3).

    Commencer définir les carrés ? Tu repères le carré actuel par le point (x, y), il suffit de définir les points correspondants à ces carrés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    let carre_central = creer_point (x + taille/3) (y + taille/3)
    ou, code équivalent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    let carre_central = (x + taille/3, y + taille/3)
    Ensuite, pour pendre le carré central :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tracercarre carre_central (taille / 3)
    Si tu veux définir une nouvelle variable pour la nouvelle taille, appelle la "taille2" ou taille' (avec une apostrophe, comme en maths, "taille prime"), mais pas "taille" si possible. Redéfinir des variables déjà existantes c'est en général une mauvaise idée.

Discussions similaires

  1. [Astuce] Approximation de racines carrées
    Par Smortex dans le forum Assembleur
    Réponses: 16
    Dernier message: 18/05/2004, 06h17
  2. Carré coincé !
    Par GLDavid dans le forum OpenGL
    Réponses: 3
    Dernier message: 11/02/2004, 10h00
  3. Tracer un carré de X cm
    Par mdel dans le forum Composants VCL
    Réponses: 6
    Dernier message: 06/01/2003, 16h17
  4. Racine carrée
    Par SteelBox dans le forum Mathématiques
    Réponses: 5
    Dernier message: 23/11/2002, 17h15
  5. algo et caml
    Par rabi dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 08/11/2002, 22h44

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