Question en "CAML"
lina_litimein
-
KX Messages postés 19031 Statut Modérateur -
KX Messages postés 19031 Statut Modérateur -
bsr a tous ;
Je suis débutante en CAML et je souhaite d'apprendre un peu plus ce langage qui m'intéresse pour mes études a l'université , et c'est pour ça que j'ai bcp de questions à poser ;
tout d'abord; j'ai pas compris la partie soulignée en gras :
let rec somme =function |[]->0 |t::q->t+somme q;;
(*la somme des entiers contenus dans une liste recursivement*)
Merci d'avance;
Je suis débutante en CAML et je souhaite d'apprendre un peu plus ce langage qui m'intéresse pour mes études a l'université , et c'est pour ça que j'ai bcp de questions à poser ;
tout d'abord; j'ai pas compris la partie soulignée en gras :
let rec somme =function |[]->0 |t::q->t+somme q;;
(*la somme des entiers contenus dans une liste recursivement*)
Merci d'avance;
3 réponses
Ce que tu fais c'est énoncer les différents cas possibles (on appelle ça du pattern matching)
Tu as donc en premier le cas où est la liste est vide, et en deuxième le cas où tu as un élément de tête t, et une sous-liste de queue q, mais ça se comprend assez bien vu le calcul que tu fais derrière, qui additionne t au à la somme de la sous-liste q.
Remarque : le | avant le [] est inutile, il n'est nécessaire que pour séparer deux cas.
Tu as donc en premier le cas où est la liste est vide, et en deuxième le cas où tu as un élément de tête t, et une sous-liste de queue q, mais ça se comprend assez bien vu le calcul que tu fais derrière, qui additionne t au à la somme de la sous-liste q.
Remarque : le | avant le [] est inutile, il n'est nécessaire que pour séparer deux cas.
let rec somme = function [] -> 0
| t::q -> t+somme q;;
Voici un code bien propre de la méthode de Newton, qui respecte le paradigme fonctionnel.
On est assez loin de la solution impérative que tu as proposé tout à l'heure.
On est assez loin de la solution impérative que tu as proposé tout à l'heure.
(* recherche de x sur [a,b] tel que f(x)=0, à un écart e près *)
(* on suppose que f est croissante et s'annule une fois entre a et b *)
(* newton : (float -> float) -> float -> float -> float -> float = <fun> *)
let rec newton f a b e =
let c = (a +. b) /. 2. in (* le milieu de [a,b] *)
if (b -. a) < e (* si l'intervalle [a,b] est suffisamment petit *)
then c
else if (f c) <= 0. (* on regarde où se situe f(c) par rapport à 0 *)
then newton f c b e (* on se restreind à l'intervalle [c,b] *)
else newton f a c e (* on se restreind à l'intervalle [a,c] *)
;;
(* recherche de la racine carrée de x, à un écart e près *)
(* racine : float -> float -> float = <fun> *)
let racine x e = newton (function y -> y*.y -. x) 0. x e;;
Bonjour ;
Merci pour vos conseils;
j'ai une autre question concernant un programme caml;Je n'ai rien compris ...pourtant j'ai essaye activement!!!
Pouvez-vous m'expliquer que fait ce programme ?
let Sqt p e =
let f x= x*.x-.p in
let a = ref 0. and b = ref (p+.1.)and i= ref (-1) in
while (!b -. !a ) > e do
if f ((!a +. !b )/.2.)=0. then a:=!b else
begin
if f ((!a +. !b )/.2.)<0. then a:=(!a +. !b )/.2. else b:=(!a +. !b )/.2.;
end;
i:= !i+1;
print_char('a'); print_int(!i);print_char('=');print_float(!a);
print_newline();
print_char('b'); print_int(!i);print_char('=');print_float(!b);
print_newline();
done;
print_string("la valeur de ? est comprise entre "); print_float(!a);
print_string ("et");
print_float(!b);;
et Merci d'avance;
Merci pour vos conseils;
j'ai une autre question concernant un programme caml;Je n'ai rien compris ...pourtant j'ai essaye activement!!!
Pouvez-vous m'expliquer que fait ce programme ?
let Sqt p e =
let f x= x*.x-.p in
let a = ref 0. and b = ref (p+.1.)and i= ref (-1) in
while (!b -. !a ) > e do
if f ((!a +. !b )/.2.)=0. then a:=!b else
begin
if f ((!a +. !b )/.2.)<0. then a:=(!a +. !b )/.2. else b:=(!a +. !b )/.2.;
end;
i:= !i+1;
print_char('a'); print_int(!i);print_char('=');print_float(!a);
print_newline();
print_char('b'); print_int(!i);print_char('=');print_float(!b);
print_newline();
done;
print_string("la valeur de ? est comprise entre "); print_float(!a);
print_string ("et");
print_float(!b);;
et Merci d'avance;
Ce programme cherche une approximation de la racine carrée de p avec un écart maximal de e.
Par exemple, Sqt 4 0.001 calcule la racine carrée de 4 avec un écart de 0.001, ce qui donne comme résultat un intervalle de valeurs entre 1.99951171875 et 2.00012207031.
Alors il existe plusieurs méthodes de calcul de la racine carrée, ici c'est la méthode de Newton qui est utilisée.
Cependant, le programme est un peu moche, les affichages ne servent pas à grand chose et ça alourdit le code, il vaut mieux faire une fonction de calcul et une autre qui affiche le résultat final...
En plus la boucle while est bien pratique, mais en Caml il est préférable d'utiliser des fonctions récursives, ça évitera entre autre d'avoir à utiliser des références qui sont lourdes à manipuler.
Et je ne parle même pas des calculs inutiles !
Par exemple, Sqt 4 0.001 calcule la racine carrée de 4 avec un écart de 0.001, ce qui donne comme résultat un intervalle de valeurs entre 1.99951171875 et 2.00012207031.
Alors il existe plusieurs méthodes de calcul de la racine carrée, ici c'est la méthode de Newton qui est utilisée.
Cependant, le programme est un peu moche, les affichages ne servent pas à grand chose et ça alourdit le code, il vaut mieux faire une fonction de calcul et une autre qui affiche le résultat final...
En plus la boucle while est bien pratique, mais en Caml il est préférable d'utiliser des fonctions récursives, ça évitera entre autre d'avoir à utiliser des références qui sont lourdes à manipuler.
Et je ne parle même pas des calculs inutiles !