Programmation ocaml

Résolu/Fermé
novice0001 - 24 juin 2017 à 12:08
Novice0001 Messages postés 20 Date d'inscription dimanche 2 avril 2017 Statut Membre Dernière intervention 28 juin 2017 - 28 juin 2017 à 12:44
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
A voir également:

8 réponses

Novice0001 Messages postés 20 Date d'inscription dimanche 2 avril 2017 Statut Membre Dernière intervention 28 juin 2017 1
24 juin 2017 à 13:56
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);;
1
Novice0001 Messages postés 20 Date d'inscription dimanche 2 avril 2017 Statut Membre Dernière intervention 28 juin 2017 1
24 juin 2017 à 13:58
J'ai utiliser ~ pour le flèche que j'ai pas sur mo. Clavie
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
Modifié le 24 juin 2017 à 15:08
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.

# 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
0
Novice0001 Messages postés 20 Date d'inscription dimanche 2 avril 2017 Statut Membre Dernière intervention 28 juin 2017 1
25 juin 2017 à 00:32
D'accord merci je vais consulte vos lien et essais de comprendre comment vous avez fait .
0
Novice0001 Messages postés 20 Date d'inscription dimanche 2 avril 2017 Statut Membre Dernière intervention 28 juin 2017 1
26 juin 2017 à 13:39
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
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
26 juin 2017 à 14:14
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
when
qui 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.
0
Novice0001 Messages postés 20 Date d'inscription dimanche 2 avril 2017 Statut Membre Dernière intervention 28 juin 2017 1 > KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024
26 juin 2017 à 14:32
Donc si j'ai bien compris je pars du principe de mon premier exercice et ajoute la clauve when.
Les ... Sont ils logique ou doivent ils être remplacé par quelques chose
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015 > Novice0001 Messages postés 20 Date d'inscription dimanche 2 avril 2017 Statut Membre Dernière intervention 28 juin 2017
26 juin 2017 à 14:49
Les ... doivent bien sûr être remplacés par le résultat que tu veux calculer pour chacun des trois cas.
0
Novice0001 Messages postés 20 Date d'inscription dimanche 2 avril 2017 Statut Membre Dernière intervention 28 juin 2017 1 > KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024
26 juin 2017 à 14:59
OK je vais essais de faire ça au propre et vous le montre
0
Novice0001 Messages postés 20 Date d'inscription dimanche 2 avril 2017 Statut Membre Dernière intervention 28 juin 2017 1 > KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024
26 juin 2017 à 15:42
Donc :
function []->0
|x::sommSeq -> x+sommSeq
when
|xmod 2 =0->1
When
|x mod 2 <>0-> 0

A mon avis ce que je viens de faire va juste signaler quand le nombre est paire ou pas
Maintenant comment faire la somme de ces nombres paire ?
0
Novice0001 Messages postés 20 Date d'inscription dimanche 2 avril 2017 Statut Membre Dernière intervention 28 juin 2017 1
26 juin 2017 à 19:40
Si je suis toujours en pleine délire , une explication de l'utilisation de when me rendera bien service
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
26 juin 2017 à 21:33
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
match x with
sauf dans le cas particulier où
x
est 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 with
par
let f = function
pour revenir à la programmation fonctionnelle de OCaml.
La suite du code est identique, à savoir une succession de pattern possibles pour la valeur
x
et les différentes opérations à réaliser pour chacun de ces pattern, ce qui s'écrit
| y -> z
avec
y
le pattern et
z
le 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::b
avec deux éléments
a
est la première valeur de la liste et
b
est 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"
0
Novice0001 Messages postés 20 Date d'inscription dimanche 2 avril 2017 Statut Membre Dernière intervention 28 juin 2017 1 > KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024
27 juin 2017 à 02:37
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
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015 > Novice0001 Messages postés 20 Date d'inscription dimanche 2 avril 2017 Statut Membre Dernière intervention 28 juin 2017
Modifié le 27 juin 2017 à 08:02
"ç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.
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;;
0
Novice0001 Messages postés 20 Date d'inscription dimanche 2 avril 2017 Statut Membre Dernière intervention 28 juin 2017 1 > KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024
27 juin 2017 à 13:11
Pas croyable j'avais la reponse devant moi.
Vous étés géniale
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015 > Novice0001 Messages postés 20 Date d'inscription dimanche 2 avril 2017 Statut Membre Dernière intervention 28 juin 2017
27 juin 2017 à 13:47
C'est ce que j'ai dit dès le départ, ce sont des exercices très simples d'application directe du cours, il faut donc que tu comprennes tout ce que ça fait (c'est à dire pas grand chose) parce que si tu bloques sur ça tu n'iras pas beaucoup plus loin...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Novice0001 Messages postés 20 Date d'inscription dimanche 2 avril 2017 Statut Membre Dernière intervention 28 juin 2017 1
27 juin 2017 à 13:45
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
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
27 juin 2017 à 15:03
Le
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é).
0
Novice0001 Messages postés 20 Date d'inscription dimanche 2 avril 2017 Statut Membre Dernière intervention 28 juin 2017 1 > KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024
27 juin 2017 à 15:34
OK
Vous etez programmeur depuis combien d'années
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015 > Novice0001 Messages postés 20 Date d'inscription dimanche 2 avril 2017 Statut Membre Dernière intervention 28 juin 2017
27 juin 2017 à 15:40
En ce qui concerne OCaml pas beaucoup... c'est un truc que j'ai appris en première année à l'école, j'en refait un peu sur les forums de temps en temps, mais mon truc à moi c'est plutôt le Java.
0
Novice0001 Messages postés 20 Date d'inscription dimanche 2 avril 2017 Statut Membre Dernière intervention 28 juin 2017 1
27 juin 2017 à 15:53
Vous devez être très doue on dit que java et c++ ... Sont plus compliqué que caml
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
27 juin 2017 à 16:45
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++
0
Xileh Messages postés 18980 Date d'inscription dimanche 10 janvier 2016 Statut Modérateur Dernière intervention 11 avril 2024 6 283
24 juin 2017 à 12:09
-1
ok j'ai compris mais c'est évident que je cherche de l'aide pas a faire exécuter mon exercice par quelqu'un et pour cela j'ai besoin d'une personne qui maitrise le domaine
0
Xileh Messages postés 18980 Date d'inscription dimanche 10 janvier 2016 Statut Modérateur Dernière intervention 11 avril 2024 6 283 > novice0001
24 juin 2017 à 12:34
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)....
0
D'accord
0
Novice0001 Messages postés 20 Date d'inscription dimanche 2 avril 2017 Statut Membre Dernière intervention 28 juin 2017 1
28 juin 2017 à 11:26
Bonjour kx
Est ce que vous n'en connaissez en circuit logique et architecture de l'ordinateur
-1
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
28 juin 2017 à 11:47
Bonjour,

Quel rapport avec la programmation OCaml ?

Si tu as une question à ce sujet poses la dans une discussion dédiée, mais ne mélange pas tout...
0
Novice0001 Messages postés 20 Date d'inscription dimanche 2 avril 2017 Statut Membre Dernière intervention 28 juin 2017 1 > KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024
28 juin 2017 à 12:42
Oui je sais ; je veux savoir si vous étés aussi bien dedans
0
Novice0001 Messages postés 20 Date d'inscription dimanche 2 avril 2017 Statut Membre Dernière intervention 28 juin 2017 1 > Novice0001 Messages postés 20 Date d'inscription dimanche 2 avril 2017 Statut Membre Dernière intervention 28 juin 2017
28 juin 2017 à 12:44
Comme ça je sais que j'obtiendrai au moins votre aide
0