Précédent   Forum des professionnels en informatique > Autres langages > Langages fonctionnels > F#
F# Forum d'entraide sur la programmation en langage fonctionnel F#
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/02/2011, 00h48   #1
Membre confirmé
 
Avatar de golden boy
 
Homme Enzo
Lycéen
Inscription : novembre 2010
Messages : 120
Détails du profil
Informations personnelles :
Nom : Homme Enzo
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Lycéen

Informations forums :
Inscription : novembre 2010
Messages : 120
Points : 224
Points : 224
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 :
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 :
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.
golden boy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2011, 01h50   #2
LLB
Membre Expert
 
Inscription : mars 2002
Messages : 944
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 944
Points : 1 080
Points : 1 080
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 :
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.
LLB est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 18/02/2011, 00h16   #3
Membre confirmé
 
Avatar de golden boy
 
Homme Enzo
Lycéen
Inscription : novembre 2010
Messages : 120
Détails du profil
Informations personnelles :
Nom : Homme Enzo
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Lycéen

Informations forums :
Inscription : novembre 2010
Messages : 120
Points : 224
Points : 224
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
golden boy est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h48.


 
 
 
 
Partenaires

Hébergement Web