Tableau en caml

Discutez d'informatique ici !
jujudu597
Membre Naturel
Messages: 87
Enregistré le: 20 Fév 2014, 17:13

Tableau en caml

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.

Avatar de l’utilisateur
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 ;;

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 11 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite