DS2.ml 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. let fibo1 n = let acc1 = ref 1 and acc2 = ref 0 in
  2. let acc3 = ref !acc2 in
  3. for i=1 to n do
  4. acc3 := !acc1 + 0;
  5. acc1 := !acc1 + !acc2;
  6. acc2 := !acc3
  7. done;
  8. !acc2
  9. ;;
  10. let rec fibo2 n = match n with
  11. | 0 -> 0
  12. | 1 -> 1
  13. | _ -> fibo2 (n-2) + fibo2 (n-1)
  14. let rec fibo_aux n acc1 acc2 = match n with
  15. | 0 -> acc1
  16. | _ -> fibo_aux (n-1) (acc2) (acc1+acc2);;
  17. let rec aux n table =
  18. if table.(n) = -1 then
  19. table.(n) <- (aux (n-1) table) + (aux (n-2) table);
  20. table.(n);;
  21. let fibo4 n = let table = Array.make (n+1) (-1) in
  22. table.(0) <- 0;
  23. table.(1)<- 1;
  24. aux n table
  25. ;;
  26. let rec fibo5 n =
  27. match n with
  28. | 0 -> 0
  29. | 1 -> 1
  30. | 2 -> 1
  31. | _ ->
  32. let p = n / 2 in
  33. let fp = fibo5 p in
  34. let fp_plus_1 = fibo5 (p + 1) in
  35. if n mod 2 = 0
  36. then fp_plus_1 * fp + fp * (fp_plus_1 - fp)
  37. else fp_plus_1 * fp_plus_1 + fp * fp
  38. ;;
  39. let rec appartenance x l =
  40. match l with
  41. | [] -> false
  42. | hd :: tl -> x = hd || appartenance x tl;;
  43. let rec test_ensemble l =
  44. match l with
  45. | [] -> true
  46. | x :: xs -> not (appartenance x xs) && test_ensemble xs;;
  47. let rec union l1 l2 =
  48. match (l1, l2) with
  49. | ([], l) -> l
  50. | (l, []) -> l
  51. | (x :: xs, y :: ys) ->
  52. if x < y then x :: union xs l2
  53. else if x > y then y :: union l1 ys
  54. else x :: union xs ys
  55. ;;
  56. let rec intersection l1 l2 =
  57. match (l1, l2) with
  58. | ([], _) | (_, []) -> []
  59. | (x :: xs, y :: ys) ->
  60. if x < y then intersection xs l2
  61. else if x > y then intersection l1 ys
  62. else x :: intersection xs ys
  63. ;;
  64. let rec difference l1 l2 =
  65. match (l1, l2) with
  66. | ([], _) -> []
  67. | (x :: xs, []) -> l1
  68. | (x :: xs, y :: ys) ->
  69. if x < y then x :: difference xs l2
  70. else if x > y then difference l1 ys
  71. else difference xs ys
  72. ;;
  73. let rec compteur1 x n =
  74. if n - x < 0 then (0, n)
  75. else
  76. let a, remainder = compteur1 x (n - x) in
  77. (a + 1, remainder)
  78. ;;
  79. let rec compteur2 x n p =
  80. if n - x < 0 || p = 0 then (0, n)
  81. else
  82. let a, remainder = compteur2 x (n - x) (p - 1) in
  83. (a + 1, remainder)
  84. ;;
  85. ;;
  86. ;;
  87. ;;
  88. ;;
  89. ;;
  90. ;;
  91. ;;
  92. ;;
  93. ;;
  94. ;;
  95. ;;
  96. let monaie = [|1; 2; 5; 10; 20; 50; 100; 200; 500; 1000; 2000; 5000|];;
  97. let monaie2 = [|5000; 2000; 1000; 500; 200; 100; 50; 20; 10; 5; 2; 1|];;
  98. let monaie2content = [|1; 10; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1|];;
  99. let monaieuk = [|30; 24; 12; 6; 3; 1|];;
  100. let monaieukcontent = Array.make (Array.length monaieuk) 0;;
  101. let compteur1 x n =
  102. let a = ref 0 in
  103. let n' = ref n in
  104. while !n' - x >= 0 do
  105. n' := !n' - x;
  106. a := !a + 1
  107. done;
  108. (!a, !n')
  109. ;;
  110. let compteur2 x n p =
  111. let a = ref 0 in
  112. let n' = ref n in
  113. let p' = ref p in
  114. while !n' - x >= 0 && !p' > 0 do
  115. n' := !n' - x;
  116. p' := !p' - 1;
  117. a := !a + 1
  118. done;
  119. (!a, !n')
  120. ;;
  121. let compteur3 x n p =
  122. let a = ref 0 in
  123. let n' = ref n in
  124. let p' = ref p in
  125. while !n' - x >= 0 && !p' > 0 do
  126. n' := !n' - x;
  127. p' := !p' - 1;
  128. a := !a + 1
  129. done;
  130. if !n' > 0 then
  131. (-1, !n')
  132. else
  133. (!a, !n')
  134. ;;
  135. let rendu_illimite n =
  136. let result = ref [] in
  137. for k = 0 to Array.length monaie2 - 1 do
  138. let a = ref 0 in
  139. let ninterne = ref n in
  140. let x = monaie2.(k) in
  141. while !ninterne - x >= 0 do
  142. ninterne := !ninterne - x;
  143. a := !a + 1
  144. done;
  145. if !ninterne > 0 then
  146. a := -1;
  147. result := !result @ [!a]
  148. done;
  149. !result;;
  150. let rendu_illimite2 n =
  151. let result = ref [] in
  152. for k = 0 to Array.length monaie2 - 1 do
  153. let a = ref 0 in
  154. let x = monaie2.(k) in
  155. let n' = ref n in
  156. while !n' - x >= 0 do
  157. n' := !n' - x;
  158. a := !a + 1
  159. done;
  160. result := !result @ [!a]
  161. done;
  162. !result;;