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 -
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;;
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:
- Comparer le premier et le dernier element d'une liste en Ocaml
- Liste déroulante excel - Guide
- Le dernier iphone - Guide
- Liste déroulante en cascade - Guide
- Liste code ascii - Guide
- Site dangereux liste - Guide
1 réponse
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 :
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) ;;
x::y::z->premier_dernier(x::z)
est equivalent a
x::z-> premier_dernier(x::z)
??
Merci beaucoup
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]
[1;2;3;4] il retourne [4;2;3;1]
Merci beaucoup
let rec premier_dernier = function
|[] -> failwith"liste vide"
|[x] -> [x]
|[x;y] -> [y;x]
|x::y::z -> premier_dernier (x::z)
Merci