Bonjour,
J'ai un petit soucis de compréhension, ou de syntaxe, sur un problème que l'on m'a donné en TD.
Je vous écris le problème comme ça vous le comprendrez.
J'ai retourné le problème dans tous les sens. J'ai crée deux petites fonction.Ecrire une fonction supprime dont les deux arguments sont des listes l1 et l2 et qui
supprime de la liste l2 les éléments contenus dans la liste l1. (On ne conservera donc de la
liste l2 que les éléments qui ne sont pas dans l1)
si la liste l1 est égale à [3; 5; 2; 1] et la liste l2 à [4; 2; 9], le résultat sera [4; 9]
L'une me permet de supprimer d'une liste un élément que je définit :
L'autre me permet de filtrer la tête d'une première liste, dans une deuxième liste. Ce code à l'air plus simple, mais la fonction je l'ai trouvé sur internet, et pas dans le cours, du coup je ne sais pas si cela passe ou pas. Voyez par vous même :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 let s1e l n = let rec test acc l n = match l with |[] -> acc |h::t -> if (h=n) then test acc t n else test (acc@[h]) t n in test [] l n;;
Entait, le problème se situe au niveau de la compréhension du problème ET de la syntaxe de la fonction récursive.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 let filtrer l1 l2 = List.filter (fun y -> y != (List.hd l1)) l2;;
D'après ce que j'ai compris, il faudrait prendre la tête de la première liste, la filtrer dans la deuxième liste, puis ré appliquer cette fonction sur la queue de la première liste et la deuxième liste déjà filtrée. J'arrives à me le représenter dans la tête, mais c'est très ambigu quand j'essaye de le coder. En fait, je ne sais pas si cette deuxième liste filtrée, je dois la stocker dans un accumulateur, ou bien la garder comme cela.
J'ai réussi à stocker cette deuxième liste dans un accumulateur, mais à chaque fois que la fonction s'appelle elle même elle rajoute dans l'accumulateur la liste filtrée, du coup quand je renvois acc, cela me fait une liste de ce style : [6;8;4;6;8;4;6;8;4;6]
Vous l'aurez compris, dans le cas précédent j'ai filtré le la liste [4;6;8] par les éléments de la liste [4;3;2;8], mais les listes filtrées se sont collées l'une sur l'autre ...
Voilà, j'espère que quelqu'un aura la courage d'essayer de me faire comprendre tout cela
Je vous remercie par avance.
Partager