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 :

Fonction récursive : multiplier deux polynômes en caml


Sujet :

Caml

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2018
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2018
    Messages : 21
    Points : 25
    Points
    25
    Par défaut Fonction récursive : multiplier deux polynômes en caml
    Bonsoir,

    Je bloque sur un exo d'informatique sur caml.
    En partant du principe qu'on représente les polynômes par leurs coefficients, je cherche à créer une fonction récursive qui renvoie la multiplication de deux polynômes.
    Je n'ai pas le droit de faire de boucles ni d'utiliser des références.
    Je comptais commencer comme ça mais je ne sais pas vraiment comment continuer :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    let rec mul = fun b c ->
    match (b,c) with
    |[],_->[]
    |_,[]->[]
    |h::d , e::f -> let l=[]
                          l::h*.e

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 87
    Points : 172
    Points
    172
    Par défaut
    Ce serait déjà bien que vous mettiez du code qui puisse être compilé ;-)

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2018
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2018
    Messages : 21
    Points : 25
    Points
    25
    Par défaut
    C'est-à-dire ?
    Par exemple comment ?

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 87
    Points : 172
    Points
    172
    Par défaut
    Déjà, utilisez la balise [CODE] pour rendre votre message plus lisible. ;-)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    let rec mul = fun b c ->
    match (b,c) with
    |[],_->[]
    |_,[]->[]
    |h::d , e::f -> let l=[]
    l::h*.e
    la partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    let l = []
    l :: h *. e
    est incorrecte et ne peut être compilée en l'état. Mettez du code que vous avez réussi à compiler (pour rappel, l'opérateur :: prend un élément de type t et une liste d'éléments de type t et renvoie une nouvelle liste composé de cet élément mis en tête de la liste. Par exemple 1 :: [2; 3] donne [1; 2; 3])

  5. #5
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2018
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2018
    Messages : 21
    Points : 25
    Points
    25
    Par défaut
    Ah d'accord je vois.
    Savez-vous comment faire pour le cas général ? (multiplier deux polynômes dont aucun n'est le polynôme nul)

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 87
    Points : 172
    Points
    172
    Par défaut
    Il faut déjà que vous décriviez comment vous représentez votre polynôme. Une fois la représentation fixée, l'addition de polynômes est facile, la multiplication beaucoup moins mais vous trouverez facilement un algorithme permettant de le faire, en ligne.

  7. #7
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2018
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2018
    Messages : 21
    Points : 25
    Points
    25
    Par défaut
    Je représente les polynômes par des listes correspondant à leur coefficient. Par exemple 3+2x+4x^2 se représente [3. ; 2. ; 4.]
    J'ai déjà fait une fonction recursive qui additionne les polynômes mais je ne trouve pas comment faire pour la multiplication.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 87
    Points : 172
    Points
    172
    Par défaut
    Il faut déjà que vous sachiez comment le faire mathématiquement, ce qui n'est pas un problème d'OCaml. Une solution consiste à multiplier chacun des coefficients du polynôme par l'autre polynôme.

  9. #9
    Membre du Club
    Homme Profil pro
    Chercheur en maths appli
    Inscrit en
    Novembre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Chercheur en maths appli
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2013
    Messages : 29
    Points : 46
    Points
    46
    Par défaut
    Essaie de faire le parallèle avec la multiplication sur des nombres classiques : lorsque tu poses la multiplication 213*654 a la main, tu fais :
    213*654 = 213*4 + 213*5*10 + 213*6*100 = 213*4 + 10*(213*5 + 10*(213*6)).
    En gros, tu multiplies un des nombres (213) par les chiffres de l'autre, tu décales d'un chiffre pour les dizaines (le . que l'on met lorsqu'on pose la multiplication a la main), de deux pour les centaines, et tu additionnes le tout.

    Pour les polynômes, c'est la même chose : soient P et Q = ax^2 + bx + c deux polynômes. Le produit P*Q se calcule comme :
    P*Q = P*c + P*b*x + P*a*x^2 = P*c + x*(P*b + x*(P*a))

    Il te suffit donc de savoir écrire la multiplication d'un polynôme par un scalaire, la multiplication d'un polynôme par le monôme x (qui correspond a la multiplication par 10 pour les nombres classiques) et l'addition de deux polynômes.

  10. #10
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2018
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2018
    Messages : 21
    Points : 25
    Points
    25
    Par défaut
    Merci ça y est j'ai réussi à la faire : )

Discussions similaires

  1. [PHP 5.2] Une fonction récursive et deux tables SQL
    Par renaud26 dans le forum Langage
    Réponses: 8
    Dernier message: 16/04/2011, 12h55
  2. Fonction récursive et deux types de retour
    Par dtom99 dans le forum Windows Forms
    Réponses: 15
    Dernier message: 03/02/2010, 20h30
  3. Problème de fonction récursive avec un TcxDBTreeList
    Par isachat666 dans le forum Composants VCL
    Réponses: 1
    Dernier message: 05/12/2005, 13h12
  4. Réponses: 13
    Dernier message: 13/10/2005, 16h03

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