Advertisement
csmine

Option info - TD 8 Piles, Files

Jun 11th, 2019
1,121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 2.67 KB | None | 0 0
  1. (* Des fonctions pour transformer des files ou piles en liste, et inversément *)
  2.  
  3. let queue_into_list q =
  4. let l = ref [] in
  5. let condition = ref true in
  6. while !condition do
  7.     if (Queue.is_empty q) then condition:=false
  8.     else l:= (Queue.take q)::(!l)
  9.     done;
  10. List.rev(!l);;
  11.  
  12. let list_into_queue l =
  13. let rec aux l q = match l with
  14. |[] -> q
  15. |h::t -> begin (Queue.add h q);
  16.             aux t q;
  17.             end
  18. in aux l ( Queue.create () );;
  19.  
  20. let stack_into_list s =
  21. let l = ref [] in
  22. let condition = ref true in
  23. while !condition do
  24. if Stack.is_empty s then condition:=false
  25. else l:=(Stack.pop s)::!l
  26. done;
  27. (List.rev !l);;
  28.  
  29. let list_into_stack l =
  30. let s = Stack.create () in
  31. let rec aux l = match l with
  32. |[] -> s
  33. |h::t -> (Stack.push h s);
  34.             aux t;
  35. in
  36. aux (List.rev l);;
  37.  
  38. (* Exercice 2 *)
  39.  
  40. type couleur = Bleue | Rouge and assiette = couleur * int ;;
  41.  
  42. let range_assiette pile =
  43.  
  44. let pile_rouge = Stack.create () in
  45. let pile_bleue = Stack.create () in
  46.  
  47. while not (Stack.is_empty pile) do
  48. let assiette = Stack.pop pile in
  49. match assiette with
  50. |(Bleue,a) -> Stack.push (Bleue,a) pile_bleue
  51. |(Rouge,a) -> Stack.push (Rouge,a) pile_rouge
  52. done;
  53.  
  54. while not (Stack.is_empty pile_bleue) do
  55. let assiette = Stack.pop pile_bleue in
  56. Stack.push assiette pile;
  57. done;
  58. while not (Stack.is_empty pile_rouge) do
  59. let assiette = Stack.pop pile_rouge in
  60. Stack.push assiette pile;
  61. done;;
  62.  
  63. let s = list_into_stack [(Bleue,5);(Rouge,6);(Bleue,7);(Rouge,9)];;
  64. range_assiette s;;
  65. stack_into_list s;;
  66.  
  67. (* Exercice 4 *)
  68.  
  69. (* 1. Une complexité qui devient de plus en plus grande pour des grands nombres : une division euclidienne pour vérifier le reste semble prendre trop de temps pour des grandes valeurs de n
  70. Réponse au "Comment ?" : théorème de décomposition unique en nombres premiers, puisque 2 3 et 5 sont premiers *)
  71.  
  72. let max n1 n2 n3 =
  73. if (n1 >= n2) then  if n1>=n3 then n1
  74.                             else n3
  75. else if n2>=n3 then n2
  76. else n3;;
  77.  
  78.  
  79. let nombre_hamming n =
  80.  
  81. let f2 = Queue.create () in
  82. let f3 = Queue.create () in
  83. let f5 = Queue.create () in
  84. Queue.push 1 f2;
  85. Queue.push 1 f3;
  86. Queue.push 1 f5;
  87. let compteur = ref 0 in
  88. let k2 = ref 0 in
  89. let k3 = ref 0 in
  90. let k5 = ref 0 in
  91. let kmax = ref 0 in
  92.  
  93. while !compteur<n do
  94. (* Queue.top renvoie le premier élément sans l'enlever *)
  95. (* push synonyme de add *)
  96.     k2 := Queue.top f2;
  97.     k3 := Queue.top f3;
  98.     k5 := Queue.top f5;
  99.     kmax := max !k2 !k3 !k5;
  100.  
  101.     if !kmax= !k2 then k2:= Queue.pop f2;
  102.     if !kmax= !k3 then k3:= Queue.pop f3;
  103.     if !kmax= !k5 then k5:= Queue.pop f5;
  104.    
  105.     Queue.push (5* !kmax) f5;
  106.     Queue.push (3* !kmax) f3;
  107.     Queue.push (2* !kmax) f2;
  108.    
  109.     incr compteur
  110. done;
  111. (queue_into_list f2,queue_into_list f3,queue_into_list f5);;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement