Fonction en caml
frpiq
-
frpiq -
frpiq -
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...
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...
A voir également:
- Fonction en caml
- Fonction si et - Guide
- Fonction miroir - Guide
- Fonction moyenne excel - Guide
- Fonction remplacer sur word - Guide
- Fonction somme excel - Guide
3 réponses
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 ?
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 = ["|||||"; "|||=="; "==|||"]
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)));;
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
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
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)));;
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.
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.
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"|"