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

F# Discussion :

Définition d'une fonction


Sujet :

F#

  1. #1
    Membre actif Avatar de golden boy
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2010
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2010
    Messages : 120
    Points : 230
    Points
    230
    Par défaut Définition d'une fonction
    Bonsoir,

    Je cherche à faire une fonction qui doit me donner la ou les solutions d'un polynôme du second degré (ax² + bx + c).

    Pour l'instant, voici ma fonction (elle fonctionne très bien) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    let polynome a b c =
        let delta = b ** 2. - 4. * a * c
        (-b - sqrt(delta)) / (2. * a),
        (-b + sqrt(delta)) / (2. * a)
     
    let phi = polynome -1. 1. 1.
    Code coloré ici

    Quand je lance ça dans interpréteur, j'ai bien mon couple de solutions qui apparait.


    Seulement voilà, j'aimerais aller plus loin et faire en sorte qu'un couple ne soit retourné que si delta > 0 et qu'un nombre seul soit retourné seulement si delta = 0 et enfin, qu'un complexe soit retourné si delta < 0;

    Je code donc ma fonction ainsi mais cela ne semble pas fonctionner :

    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
    17
     
    let polynome a b c =
        let delta = b ** 2. - 4. * a * c
     
        if delta > 0. then
        (-b - sqrt(delta)) / (2. * a),
        (-b + sqrt(delta)) / (2. * a)
     
        elif delta = 0. then
        (-b) / (2. * a)
     
        else
        (-b - sqrt(abs(delta))) / (2. * a),
        (-b + sqrt(abs(delta))) / (2. * a)
     
     
    let phi = polynome -1. 1. 1.
    Ou ici

    Je pense savoir d'où vient l'erreur : si mon premier 'if' retourne un tuple de float, alors mes autres 'elif' et 'else' doivent aussi retourner un tuple de float.


    Y a t-il un moyen de remédier à ce problème ?

    Merci d'avance.

  2. #2
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    mars 2002
    Messages
    967
    Détails du profil
    Informations forums :
    Inscription : mars 2002
    Messages : 967
    Points : 1 339
    Points
    1 339
    Par défaut
    Quel serait le type de phi ? Comment l'utiliserais-tu ensuite ?
    C'est le problème dans tous les langages à typage statique : le compilateur veut connaître les types que tu manipules (et sans exécuter ton code). Il faut que chaque valeur ait un seul type.

    Une solution possible est de renvoyer une liste de nombre complexes. La liste peut avoir 1 ou 2 éléments, dont la partie imaginaire sera nulle pour delta>=0.

    Une autre solution est de définir un type somme et de l'utiliser comme valeur de retour :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    type Solutions =
      | Real1 of float
      | Real2 of float * float
      | Complex2 of Complex * Complex
    On peut trouver d'autres représentations, ça dépend essentiellement de comment tu veux manipuler ta valeur de retour ensuite.

  3. #3
    Membre actif Avatar de golden boy
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2010
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2010
    Messages : 120
    Points : 230
    Points
    230
    Par défaut
    Bonsoir, merci de votre réponse.

    Le type somme semble en effet être une solution adaptée, je n'y avais pas pensé car je ne connaissais pas encore ce type.
    Merci, je vais donc essayer de re-coder ma fonction

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

Discussions similaires

  1. Définition d'une fonction en Prolog
    Par abssef dans le forum Prolog
    Réponses: 6
    Dernier message: 17/06/2008, 20h51
  2. [Débutant] Définition d'une fonction
    Par louftansa dans le forum MATLAB
    Réponses: 8
    Dernier message: 16/04/2008, 11h30
  3. Réponses: 2
    Dernier message: 03/05/2007, 17h17
  4. Définition d'une fonction static ?
    Par tintin72 dans le forum C++
    Réponses: 9
    Dernier message: 22/12/2005, 11h50
  5. afficher la définition d'une fonction stockée
    Par bdkiller dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 03/09/2004, 13h28

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