Comparer le premier et le dernier element d'une liste en Ocaml

Résolu/Fermé
shimo208 Messages postés 10 Date d'inscription lundi 3 juin 2013 Statut Membre Dernière intervention 29 décembre 2013 - 3 juin 2013 à 20:38
shimo208 Messages postés 10 Date d'inscription lundi 3 juin 2013 Statut Membre Dernière intervention 29 décembre 2013 - 4 juin 2013 à 21:20
Bonjour les amis je me suis planter dans une fonction recursive en ocaml qui compare si le premier et le dernier element son egaux ou pas si ils sont egaux il renvoie true sinon false , voila le travail que j'ai fais je suis sur qu'il est faux vue qu'il ne marche pas :D merci pour votre aide

let rec premier_dernier l= match l with
|[]->failwith "liste vide"
|[h;x]->if h=x then true else false
|h::t-> if h=(premier_dernier (List.tl t))then true else false;;

1 réponse

KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
3 juin 2013 à 20:53
C'est quasiment bon, il manque pas grand chose.

Quelques remarques :

1) évites d'utiliser des méthodes comme "List.tl t" ici, il est plus efficace d'utiliser à fond le pattern matching.

2) ne fais jamais des conditions "if a=b then true else false", c'est moche. Utilises directement la valeur "a=b" c'est déjà un booléen.

3) je pense qu'il te manque un cas, lorsque la liste ne contient qu'un élément, dans ce cas j'aurait tendance à considérer que le résultat est true (le premier est le dernier donc ils sont égaux...)

Sinon, voici une manière de faire :

let rec premier_dernier = function 
    |[] -> false
    |[x] -> true
    |[x;y] -> x=y
    |x::y::z -> premier_dernier (x::z)
;;
1
shimo208 Messages postés 10 Date d'inscription lundi 3 juin 2013 Statut Membre Dernière intervention 29 décembre 2013
3 juin 2013 à 21:09
T'es FORT :D mais pour la dernier ligne
x::y::z->premier_dernier(x::z)
est equivalent a
x::z-> premier_dernier(x::z)
??
Merci beaucoup
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019 > shimo208 Messages postés 10 Date d'inscription lundi 3 juin 2013 Statut Membre Dernière intervention 29 décembre 2013
3 juin 2013 à 21:13
Si tu fais "x::z-> premier_dernier(x::z)" alors tu vas tourner en rond.

Quand je fais "x::y::z->premier_dernier(x::z)" je supprime un élément (le "y"), donc la taille de la liste diminue progressivement jusqu'à tomber sur le cas [x;y]
0
shimo208 Messages postés 10 Date d'inscription lundi 3 juin 2013 Statut Membre Dernière intervention 29 décembre 2013
3 juin 2013 à 21:18
D'accord , Merci Beaucoup tu m'a vraiment aidé .
0
shimo208 Messages postés 10 Date d'inscription lundi 3 juin 2013 Statut Membre Dernière intervention 29 décembre 2013
4 juin 2013 à 14:37
Bonjour Kx je me suis planter sur une autre fonction c'est a peut pret la meme mais je voudrai inverser le premier et le dernier element comme suivant
[1;2;3;4] il retourne [4;2;3;1]
Merci beaucoup
0
shimo208 Messages postés 10 Date d'inscription lundi 3 juin 2013 Statut Membre Dernière intervention 29 décembre 2013
4 juin 2013 à 14:39
c bon je croi avoir reussir :D
let rec premier_dernier = function
|[] -> failwith"liste vide"
|[x] -> [x]
|[x;y] -> [y;x]
|x::y::z -> premier_dernier (x::z)
Merci
0