Fonction en caml

Fermé
frpiq - 24 nov. 2008 à 14:43
 frpiq - 4 déc. 2008 à 11:06
Bonjour,

J'ai écrit cette fonction en caml :
let rec mar_pos = function
1 -> ("|"::[])
| 2 -> ("||"::"==")
| n -> ("|"^mar_pos(n-1)::"=="^mar-pos(n-2));;

Qui devrait me donner pour n=3
("|||","|==","==|")

Et j'ai le message d'erreur : This expression has type string but is here used with type string list

Je n'arrive pas à m'en sortir...

3 réponses

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
3 déc. 2008 à 09:02
Tu n'as pas clairement expliqué ce que tu voulais pour n>3,
Faut-il que mar_pos n renvoie n termes ou au maximum 3 tel que je l'ai fait ?
let rec mar_pos x =
match x with 
|1 -> ["|"]
|2 -> ["||";"=="]
|n -> let h=hd (mar_pos (n-2)) in
	 ["|"^(hd (mar_pos (n-1)))]@[h^"=="]@["=="^h];;
Ce qui donne :
mar_pos 1;; #- : string list = ["|"]
mar_pos 2;; #- : string list = ["||"; "=="]	
mar_pos 3;; #- : string list = ["|||"; "|=="; "==|"]
mar_pos 4;; #- : string list = ["||||"; "||=="; "==||"]
mar_pos 5;; #- : string list = ["|||||"; "|||=="; "==|||"]
1
Merci de tes efforts.

pour 4, le résultat d'exécution :
""|"^pos (3)::"=="^pos(2)
"||"^pos(2)::"|=="^pos(1)::"==||"::"===="
"||||","||==","|==|","==||","===="

il s'agit en fait du nombre de compositions possible du placement de plaquettes soit horizontales "=" soit verticales"|"
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
1 déc. 2008 à 15:15
J'ai pas vérifié mais ceci devrait mieux marcher...
let rec mar_pos x =
match x with
|1 -> ["|"]
|2 -> ["||=="]
|n -> ("|"::(mar_pos (n-1)) )@("=="::(mar-pos (n-2)));; 
0
Merci. Effectivement, ça marche mieux.

let rec mar_pos x =
match x with
|1 -> ["|"]
|2 -> ["||"]@["=="]
|n -> ("|"::(mar_pos (n-1)) )@("=="::(mar_pos (n-2)));;

Mais j'obtiens :
mar_pos 3;;
- : string list = ["|"; "||"; "=="; "=="; "|"]

alors que je voudrais
["|||"; "|=="; "==|"] la concaténation avec :: ne se fait pas. Quand je fais avec ^ j'ai une erreur
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020 > frpiq
2 déc. 2008 à 08:19
Le problème c'est que tu veux mélanger d'une part la concaténation de string ^ et la concaténation de list :: et @ à l'intérieur des mêmes entités ce qui est difficile, il faut que tu choisisse de tout avoir en string list ou de tout avoir en string !
0
frpiq > KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024
2 déc. 2008 à 09:40
Bonjour,

Oui j'ai bien compris que j'avais les 2 à faire. Le problème est que je n'arrive pas au résultat que j'attends.
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
4 déc. 2008 à 10:28
Avec tes explications, ma détermination, un peu de vérification et même si je ne comprends toujours pas à quoi ça peut bien servir...
let rec ajouter s l=
match l with
|[]->[]
|t::q->(s^t)::(ajouter s q);;

let rec mar_pos n=
match n with
|1->["|"]
|2->["||";"=="]
|n->(ajouter "|" (mar_pos (n-1)))@(ajouter "==" (mar_pos (n-2)));;
0
Ce programme permet de trouver le nombre de positionnements différents en fonction du nombre de plaques dont on dispose.

Pour ce qui est de caml, je suppose que sont utilité se limite aux fins de l'enseignement de l'algorithmique.

Merci de tes efforts qui me permettent de progresser sur les manipulations de listes.
0