Programmation ocaml
Résolu
novice0001
-
Novice0001 Messages postés 20 Date d'inscription Statut Membre Dernière intervention -
Novice0001 Messages postés 20 Date d'inscription Statut Membre Dernière intervention -
Bonjour
Je débutant en programmation 3 mois car etudiant ; j'ai deux exercice qui n'arrive pas a passe j'espère avoir de l'aide
1-On demande l'algorithme et l'implantation d'une fonction récursive en OCAML nommée SommeSeq, prenant en paramètres une séquence d'entiers et qui calcul la somme des éléments de cette séquence , exemple : SommeSeq[6;9]=15 .
2- Concevoir une fonction récursive prenant en paramètres une séquence d'entiers et qui déterminé le nombre d'éléments pairs de cette séquence . il s'agit de donner l'ensemble des étapes de la conception .
Merci de m'aider c'est urgent
Je débutant en programmation 3 mois car etudiant ; j'ai deux exercice qui n'arrive pas a passe j'espère avoir de l'aide
1-On demande l'algorithme et l'implantation d'une fonction récursive en OCAML nommée SommeSeq, prenant en paramètres une séquence d'entiers et qui calcul la somme des éléments de cette séquence , exemple : SommeSeq[6;9]=15 .
2- Concevoir une fonction récursive prenant en paramètres une séquence d'entiers et qui déterminé le nombre d'éléments pairs de cette séquence . il s'agit de donner l'ensemble des étapes de la conception .
Merci de m'aider c'est urgent
A voir également:
- Programmation ocaml
- Application de programmation - Guide
- Programmation envoi sms - Guide
- Programmation vb - Télécharger - Langages
- Programmation binaire - Guide
- Programmation télécommande porte de garage brico depot - Forum Matériel & Système
8 réponses
Pour 1:
Réalisation :
-algorithme : SommeSeq[a;b] : si a=0 alors b , si b= 0 alors a , si (a+b)= 0 alors 0 si non (a+b)
-Implantation: let rec ( SommeSeq : in~in ) = function [a;b] ~ if a=0 then b if b=0 then a if (a+b)=0 then 0 else (a+b);;
Réalisation :
-algorithme : SommeSeq[a;b] : si a=0 alors b , si b= 0 alors a , si (a+b)= 0 alors 0 si non (a+b)
-Implantation: let rec ( SommeSeq : in~in ) = function [a;b] ~ if a=0 then b if b=0 then a if (a+b)=0 then 0 else (a+b);;
Novice0001
Messages postés
20
Date d'inscription
Statut
Membre
Dernière intervention
1
J'ai utiliser ~ pour le flèche que j'ai pas sur mo. Clavie
Bonjour,
Tu devrais regarder quelques articles de documentation, ce que tu cherches à faire est un exercice très simple d'application directe du cours.
http://caml.inria.fr/pub/docs/manual-ocaml/
https://fr.wikipedia.org/wiki/OCaml
"algorithme : SommeSeq[a;b] : si a=0 alors b , si b= 0 alors a , si (a+b)= 0 alors 0 si non (a+b)"
Ici tu réfléchis en programmation impérative (et mal en plus), mais OCaml est un langage fonctionnel, il faut penser différemment et découper la structure d'une liste.
D'ailleurs ici tu pars du principe que tu prends en paramètres une liste qui contient uniquement deux valeurs a et b, alors que ta liste pourrait contenir 0, 1, 2, 3... N éléments, et il faut gérer tous les cas.
https://fr.wikipedia.org/wiki/OCaml#Manipulation_de_listes
Attention : ta fonction ne peut pas s’appeler SommeSeq, les noms de fonctions doivent obligatoirement commencer par une minuscule.
Tu devrais regarder quelques articles de documentation, ce que tu cherches à faire est un exercice très simple d'application directe du cours.
http://caml.inria.fr/pub/docs/manual-ocaml/
https://fr.wikipedia.org/wiki/OCaml
"algorithme : SommeSeq[a;b] : si a=0 alors b , si b= 0 alors a , si (a+b)= 0 alors 0 si non (a+b)"
Ici tu réfléchis en programmation impérative (et mal en plus), mais OCaml est un langage fonctionnel, il faut penser différemment et découper la structure d'une liste.
D'ailleurs ici tu pars du principe que tu prends en paramètres une liste qui contient uniquement deux valeurs a et b, alors que ta liste pourrait contenir 0, 1, 2, 3... N éléments, et il faut gérer tous les cas.
https://fr.wikipedia.org/wiki/OCaml#Manipulation_de_listes
Attention : ta fonction ne peut pas s’appeler SommeSeq, les noms de fonctions doivent obligatoirement commencer par une minuscule.
# let rec somme = function [] -> 0 | x::seq -> x + somme seq;; val somme : int list -> int = <fun> # #trace somme;; somme is now traced. # somme [1; 2; 3; 4];; somme <-- [1; 2; 3; 4] somme <-- [2; 3; 4] somme <-- [3; 4] somme <-- [4] somme <-- [] somme --> 0 somme --> 4 somme --> 7 somme --> 9 somme --> 10 - : int = 10 # #untrace somme;; somme is no longer traced.La confiance n'exclut pas le contrôle
Bonjour kx
Après analyse j'ai compris comment vous fait et c'est vraiment correcte merci beaucoup .
Pour mon deuxième exercice qui est de faire une fonction qui determine le nombre dnéléments pairs d'une séquence d'entiers ;
Alors : la fonction x mod 2 qui donne le reste de la division de x/2 ; donc je pense qu'ici je dois associer deux fonction la première mod 2 d'une séquence puis leur somme mais je sais pas comment les associer
Après analyse j'ai compris comment vous fait et c'est vraiment correcte merci beaucoup .
Pour mon deuxième exercice qui est de faire une fonction qui determine le nombre dnéléments pairs d'une séquence d'entiers ;
Alors : la fonction x mod 2 qui donne le reste de la division de x/2 ; donc je pense qu'ici je dois associer deux fonction la première mod 2 d'une séquence puis leur somme mais je sais pas comment les associer
En fait il n'y a pas besoin de deux fonctions (ça marcherait sûrement mais ce n'est pas le plus simple). Sur le même principe de pattern matching tu peux utiliser la clause
Exemple :
On a ainsi nos 3 cas : liste vide, liste avec x pair, liste avec x impair.
whenqui permet de rajouter une condition sur une valeur.
Exemple :
function [] -> ... | x::seq when x mod 2 = 0 -> ... | x::seq -> ...
On a ainsi nos 3 cas : liste vide, liste avec x pair, liste avec x impair.
Si je suis toujours en pleine délire , une explication de l'utilisation de when me rendera bien service
Reprenons les bases (que tu retrouveras dans plein de cours sur internet)
OCaml est un langage fortement typé (c'est d'ailleurs le plus typé que je connaisse), par exemple si tu fais x + y il sait que x et y sont des int parce que + ne peut s'utiliser que sur des int, du coup il n'y a pas besoin - contrairement à d'autres langages - que x et y sont des int, OCaml va le deviner tout seul (on appelle ça l'inférence de type).
Le pattern matching (ou "filtrage par motif" en français) permet de décomposer un type de données pour identifier les différents éléments de sa structure. C'est ce qui rend l'utilisation des listes intéressantes puisque OCam va être capable de découper la liste en deux morceaux : l'élément de tête, et le reste de la liste derrière.
L'écriture générale du pattern matching en OCaml c'est
Dans ce cas on peut remplacer
La suite du code est identique, à savoir une succession de pattern possibles pour la valeur
Je résume, OCaml est capable de déstructurer une variable en différents pattern possibles et associer à chacun d'entre eux un résultat différent.
Remarque : OCaml est également capable de savoir si tous les pattern possibles ont un résultat associé et générera une erreur s'il en manque.
Dans le cas d'une liste (ce qui nous intéresse dans tes exercices) il y a deux patterns possibles : soit la liste est vide et elle vaut donc
Mais le pattern matching peut aller plus loin en rajoutant des conditions sur ces différents éléments, c'est là qu'intervient le
Ce code là va renvoyer si la liste est vide, 1 si le premier nombre est impair, 2 si le deuxième nombre est pair.
Remarque : dans ce code on ne se sert pas de
De plus, dans le dernier cas on ne se sert pas de x non plus donc on pourrait aussi le remplacer par code <caml>_</code> :
Et dernière simplification, on peut dire à la fin "prends tous les autres cas possibles" et mettre un _ sur l'ensemble de la clause.
Littéralement on peut traduire ceci par "soit f une fonction qui prend en entrée une liste vide et renvoie 0, ou qui prends en entrée une liste commençant par un nombre x tel que x mod 2=0 et renvoie 2, ou qui renvoie 1 dans les autres cas"
OCaml est un langage fortement typé (c'est d'ailleurs le plus typé que je connaisse), par exemple si tu fais x + y il sait que x et y sont des int parce que + ne peut s'utiliser que sur des int, du coup il n'y a pas besoin - contrairement à d'autres langages - que x et y sont des int, OCaml va le deviner tout seul (on appelle ça l'inférence de type).
Le pattern matching (ou "filtrage par motif" en français) permet de décomposer un type de données pour identifier les différents éléments de sa structure. C'est ce qui rend l'utilisation des listes intéressantes puisque OCam va être capable de découper la liste en deux morceaux : l'élément de tête, et le reste de la liste derrière.
L'écriture générale du pattern matching en OCaml c'est
match x withsauf dans le cas particulier où
xest le dernier paramètre d'une fonction et le résultat du match est exactement le résultat de la fonction (ce que l'on essaye de faire le plus souvent possible et c'est le cas dans tes exercices).
Dans ce cas on peut remplacer
let f x = match x withpar
let f = functionpour revenir à la programmation fonctionnelle de OCaml.
La suite du code est identique, à savoir une succession de pattern possibles pour la valeur
xet les différentes opérations à réaliser pour chacun de ces pattern, ce qui s'écrit
| y -> zavec
yle pattern et
zle résultat de ce fonction pour ce pattern.
Je résume, OCaml est capable de déstructurer une variable en différents pattern possibles et associer à chacun d'entre eux un résultat différent.
Remarque : OCaml est également capable de savoir si tous les pattern possibles ont un résultat associé et générera une erreur s'il en manque.
Dans le cas d'une liste (ce qui nous intéresse dans tes exercices) il y a deux patterns possibles : soit la liste est vide et elle vaut donc
[], soit elle est décomposable en
a::bavec deux éléments
aest la première valeur de la liste et
best la liste qui contient tous les autres éléments.
Mais le pattern matching peut aller plus loin en rajoutant des conditions sur ces différents éléments, c'est là qu'intervient le
when. Ainsi au lieu d'avoir un seul résultat pour chaque pattern possible, on va pouvoir affiner et créer des sous-pattern (qui ne sont plus structurels mais logique) et leur associer des résultats différents, dans ton cas il s'agit de différencier les nombres pairs et les nombres impairs.
let f = function | [] -> 0 | x::y when x mod 2 = 0 -> 2 | x::y -> 1 ;;
Ce code là va renvoyer si la liste est vide, 1 si le premier nombre est impair, 2 si le deuxième nombre est pair.
Remarque : dans ce code on ne se sert pas de
y, on peut le remplacer par
_:
let f = function | [] -> 0 | x::_ when x mod 2 = 0 -> 2 | x::_ -> 1 ;;
De plus, dans le dernier cas on ne se sert pas de x non plus donc on pourrait aussi le remplacer par code <caml>_</code> :
let f = function | [] -> 0 | x::_ when x mod 2 = 0 -> 2 | _::_ -> 1 ;;
Et dernière simplification, on peut dire à la fin "prends tous les autres cas possibles" et mettre un _ sur l'ensemble de la clause.
let f = function | [] -> 0 | x::_ when x mod 2 = 0 -> 2 | _ -> 1 ;;
Littéralement on peut traduire ceci par "soit f une fonction qui prend en entrée une liste vide et renvoie 0, ou qui prends en entrée une liste commençant par un nombre x tel que x mod 2=0 et renvoie 2, ou qui renvoie 1 dans les autres cas"
La je comprends mieux mais un problème se pose ça ne donne pas le nombre d'entiers dans la séquence mais donne 2 s'il n'y a n'a pas et 1 au cas contraire donc il faut a mon avis un autre clause qui fait additionne les 1 . j'ai changé les place xmod2 = 0-> 1 pour faciliter l'addition au lieu de 2 qui ramène a faire une division pour trouve LR nombre d'entier pairs dans la séquence
"ça ne donne pas le nombre d'entiers dans la séquence mais donne 2 s'il n'y a n'a pas et 1"
Je n'ai jamais dit que c'était la réponse à ton exercice... c'était juste un exemple pour illustrer ce que je disais.
Si tu veux la réponse à ton deuxième exercice il faut plutôt repartir de la solution du premier exercice, celle que je t'ai donné dimanche.
Celle-ci calcule la somme de chaque nombre dans la liste, tu as juste remplacer x par 1 dans la somme et tu obtiens le nombre d'élément dans la liste :
Evidemment, ça n'a plus trop de sens que ça s'appelle "somme", mais tu lui donne le nom que tu veux...
Reste plus qu'à gérer la distinction pair ou impair avec le when :
Et on simplifie un peu :
Je n'ai jamais dit que c'était la réponse à ton exercice... c'était juste un exemple pour illustrer ce que je disais.
Si tu veux la réponse à ton deuxième exercice il faut plutôt repartir de la solution du premier exercice, celle que je t'ai donné dimanche.
let rec somme = function | [] -> 0 | x::seq -> x + somme seq;;
Celle-ci calcule la somme de chaque nombre dans la liste, tu as juste remplacer x par 1 dans la somme et tu obtiens le nombre d'élément dans la liste :
let rec somme = function | [] -> 0 | x::seq -> 1 + somme seq;;
Evidemment, ça n'a plus trop de sens que ça s'appelle "somme", mais tu lui donne le nom que tu veux...
let rec f = function | [] -> 0 | x::seq -> 1 + f seq;;
Reste plus qu'à gérer la distinction pair ou impair avec le when :
let rec f = function | [] -> 0 | x::seq when (x mod 2 = 0) -> 1 + f seq | x::seq -> 0 + f seq;;
Et on simplifie un peu :
let rec f = function | [] -> 0 | x::seq when (x mod 2 = 0) -> 1 + f seq | _::seq -> f seq;;
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
let rec sn = function
[]->0
|x::seq when (x>0)-> 1+sn seq
|x::seq -> 0+sn seq ;;
Je suis partis du précédent concepte
Pour calcul la somme des entiers positifs d'une séquence
[]->0
|x::seq when (x>0)-> 1+sn seq
|x::seq -> 0+sn seq ;;
Je suis partis du précédent concepte
Pour calcul la somme des entiers positifs d'une séquence
Le
Sinon, on pourrait considérer 0 comme étant positif et donc vouloir le compter dans ta fonction, ce qui n'est pas le cas pour l'instant.
À part ça, je ne vois pas de problème (mais je n'ai pas testé).
0 +est inutile et cela créé une surcharge de travail pour le programme (concept de récursion terminale dont on n'a pas parlé précédemment).
Sinon, on pourrait considérer 0 comme étant positif et donc vouloir le compter dans ta fonction, ce qui n'est pas le cas pour l'instant.
À part ça, je ne vois pas de problème (mais je n'ai pas testé).
Vous devez être très doue on dit que java et c++ ... Sont plus compliqué que caml
Tout s'apprend.
Mais on ne peut pas comparer OCaml avec Java/C++ car ce sont des langages qui ne servent pas à la même chose. Jamais tu ne feras un jeu vidéo en OCaml...
En soit c'est rarement le langage en lui même qui est compliqué, c'est les concepts théoriques qu'il y a derrière.
Les langages fonctionnels comme OCaml sont difficiles à appréhender par des développeurs qui connaissent uniquement des langages procéduraux ou objets comme Java/C++
Mais on ne peut pas comparer OCaml avec Java/C++ car ce sont des langages qui ne servent pas à la même chose. Jamais tu ne feras un jeu vidéo en OCaml...
En soit c'est rarement le langage en lui même qui est compliqué, c'est les concepts théoriques qu'il y a derrière.
Les langages fonctionnels comme OCaml sont difficiles à appréhender par des développeurs qui connaissent uniquement des langages procéduraux ou objets comme Java/C++
Oui, mais pour pouvoir éventuellement obtenir de l'aide d'une personne maitrisant le domaine, tout en respectant la charte de CCM, il te faut présenter ce que tu as déjà fait et quels sont le(s) point(s) de blocage(s)....