Tableau en caml
Discutez d'informatique ici !
-
jujudu597
- Membre Naturel
- Messages: 87
- Enregistré le: 20 Fév 2014, 17:13
-
par jujudu597 » 10 Nov 2014, 08:50
Bonjour,
Je m'entraine sur une fonction simple en caml mais j'ai toujours un message d'erreur.
je veux créer une fonction qui m'inverse l'ordre des éléments d'un tableau d'entrée. C'est a dire si en entrée j'ai [|1;9;6|] en retour j'aurais [|6;9;1|].
Voici la fonction que j'ai écrite en espérant que vous pourriez m'aider :)
let reverse tab =
let n = Array.length tab
let newtab = Array.make n 0
for i = 0 to n-1 do
newtab.(i) <- tab.(n-1-i)
done;;
j'ai même tenter de mettre des points virgules comme ceci mais sans resultat.
let reverse tab =
let n = Array.length tab;
let newtab = Array.make n 0;
for i = 0 to n-1 do
newtab.(i) <- tab.(n-1-i)
done;;
-
Monsieur23
- Habitué(e)
- Messages: 3966
- Enregistré le: 01 Oct 2006, 17:24
-
par Monsieur23 » 10 Nov 2014, 10:14
Aloha,
Quel est le message d'erreur ? Est-ce que le tableau que tu veux inverser est forcément un tableau d'entier ? (sinon, initialise ton newtab à tab.(0))
« Je ne suis pas un numéro, je suis un homme libre ! »
-
joel76
- Membre Relatif
- Messages: 230
- Enregistré le: 11 Fév 2013, 15:31
-
par joel76 » 10 Nov 2014, 18:51
Bonjour
Il faut raisonner récursif et fonctionnel avec Caml, pas impératif.
inverser un tableau, c'est quoi ?
- si le tableau est vide, c'est le tableau vide
-sinon, on enlève le premier élément du tableau qu'on ajoute à la fin du reverse du reste du tableau;
Ce qui donne
- Code: Tout sélectionner
let rec reverse tab =
if (tab = Array.empty) then Array.empty
else Array.append (reverse tab.[1 ..]) [|tab.[0]|]
PS comme d'hab c'est du F# mais je pense que ça passe aussi en Caml.
-
Rockleader
- Habitué(e)
- Messages: 2126
- Enregistré le: 11 Oct 2011, 18:42
-
par Rockleader » 10 Nov 2014, 19:16
Avec mes faibles connaissances en caml, je serais d'accord pour le coté récursif et surtout fonctionnel, surtout que mon prof m'a dit: Itératif = 0 au partiel :d
Mis à part ça, mon prof a appelé cette structure de tableau une liste alors je sais pas si on parle bien de la même chose ou pas.
Pour ma part j'aurais fait une première fonction qui retourne le premier entier de la liste.
Et je me serais servi de ça pour travailler à chaque fois avec la lister sur laquelle on a dépilé la première valeur.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !
-
joel76
- Membre Relatif
- Messages: 230
- Enregistré le: 11 Fév 2013, 15:31
-
par joel76 » 10 Nov 2014, 20:16
Rockleader a écrit:Pour ma part j'aurais fait une première fonction qui retourne le premier entier de la liste.
Et je me serais servi de ça pour travailler à chaque fois avec la lister sur laquelle on a dépilé la première valeur.
Tu as raison pour les listes, mais la on parle de tableau, ce qui est un peu different.
pour les listes Head et Tail sont définis :
- Code: Tout sélectionner
let rec list_reverse list =
match list with
| [] -> []
| _ -> List.append (list_reverse (List.tail list )) [List.head list]
-
Monsieur23
- Habitué(e)
- Messages: 3966
- Enregistré le: 01 Oct 2006, 17:24
-
par Monsieur23 » 11 Nov 2014, 09:29
joel76 a écrit:Bonjour
Il faut raisonner récursif et fonctionnel avec Caml, pas impératif.
inverser un tableau, c'est quoi ?
- si le tableau est vide, c'est le tableau vide
-sinon, on enlève le premier élément du tableau qu'on ajoute à la fin du reverse du reste du tableau;
Ce qui donne
- Code: Tout sélectionner
let rec reverse tab =
if (tab = Array.empty) then Array.empty
else Array.append (reverse tab.[1 ..]) [|tab.[0]|]
PS comme d'hab c'est du F# mais je pense que ça passe aussi en Caml.
Joel, pour moi, certes le Caml, c'est récursif, mais une structure de tableau, ça impose l'impératif
Je pense que si on veut faire du fonctionnel, on retourne une liste, pas un tableau

« Je ne suis pas un numéro, je suis un homme libre ! »
-
joel76
- Membre Relatif
- Messages: 230
- Enregistré le: 11 Fév 2013, 15:31
-
par joel76 » 11 Nov 2014, 09:40
Peut-être, mais si on pense impératif en Caml, on se fourvoie. C'est vrai que ça choque un peu ce genre de construction pour un tableau, mais le langage le permet et que c'est son esprit, pourquoi ne pas le faire.
D'ailleur, pourquoi ça choque, c'est que pour ma part (et peut-être pour toi), j'ai commencé par le C, le pascal et je passais mon temps à manipuler des tableaux et des boucles for. Si j'avais commencé par Prolog (ou Scheme) ce ne serait pas pareil.
-
jujudu597
- Membre Naturel
- Messages: 87
- Enregistré le: 20 Fév 2014, 17:13
-
par jujudu597 » 11 Nov 2014, 13:59
Bonjour a tous,
Merci bcp pour vos réponses!
Cependant, jai trouver une réponse qui fonctionne: la voici
let reverse tab =
let n = Array.length tab in
let newtab = Array.make n 0 in
for i = 0 to n-1 do
newtab.(i) <- tab.(n-1-i)
done;
newtab ;;
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 11 invités