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

Résolu
shimo208 Messages postés 10 Date d'inscription   Statut Membre Dernière intervention   -  
shimo208 Messages postés 10 Date d'inscription   Statut Membre Dernière intervention   -
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;;
A voir également:

1 réponse

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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   Statut Membre Dernière intervention  
 
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 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020 > shimo208 Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention  
 
D'accord , Merci Beaucoup tu m'a vraiment aidé .
0
shimo208 Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention  
 
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