Advertisement
yannick_degardin

Untitled

Nov 5th, 2020 (edited)
1,859
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 7.80 KB | None | 0 0
  1. (* TD5 exo26 *)
  2.  
  3. (*Q1 et Q2*)
  4.  
  5. (* premiere version *)
  6. let rec simple_average_ue_aux(marks : float list) : float * int =
  7.     if marks = [] then (0.0, 0)
  8.     else let (m, r) : float * float list = (fst(marks), rem_fst(marks)) in
  9.         let (mark_r, nb_r) : float * int = simple_average_ue_aux(r) in
  10.             (m +. mark_r, nb_r + 1)
  11. ;;
  12.  
  13. let simple_average_ue(marks : float list) : float =
  14.     let (sum_marks, nb_marks) : float * int = simple_average_ue_aux(marks) in
  15.     if nb_marks = 0
  16.     then failwith("erreur simple_average_ue : pas de notes")
  17.     else sum_marks /. float_of_int(nb_marks)
  18. ;;
  19.  
  20. (* seconde version: On remarquera que les données liées au pb sont
  21. ici communiquées via les arguments entre les différents appels récursifs*)
  22.  
  23. let rec simple_average_ue_aux(marks, sum, nb : float list * float * int) : float * int =
  24.     if marks = []
  25.     then (sum, nb)
  26.     else
  27.         let (m, r) : float * float list = (fst(marks), rem_fst(marks)) in
  28.         simple_average_ue_aux(r, m +. sum, nb + 1)
  29. ;;
  30.  
  31. let simple_average_ue(marks : float list) : float =
  32.     let (sum_marks, nb_marks) : float * int = simple_average_ue_aux(marks, 0.0, 0) in
  33.     if nb_marks = 0
  34.     then failwith("erreur simple_average_ue : pas de notes")
  35.     else sum_marks /. float_of_int(nb_marks)
  36. ;;
  37.  
  38. (* Q3 *)
  39. (* premiere version *)
  40. let rec average_ue_aux(marks, coeffs : float list * int list) : float * int =
  41. if marks = []
  42. then
  43.     if coeffs = []
  44.     then (0.0, 0)
  45.     else failwith("erreur average_ue_aux : moins de notes que de coeffs")
  46. else
  47.     if coeffs = []
  48.     then failwith("erreur average_ue_aux : moins de coeffs que de notes")
  49.     else
  50.         let (m, m_r) : float * float list = (fst(marks), rem_fst(marks))
  51.         and (c, c_r) : int * int list = (fst(coeffs), rem_fst(coeffs))in
  52.             let (mark_r, coeff_r) : float * int = average_ue_aux(m_r, c_r) in
  53.                 (m *. float_of_int(c) +. mark_r, c + coeff_r)
  54. ;;
  55.  
  56. let average_ue(marks, coeffs : float list * int list) : float =
  57.     let (sum_marks, sum_coeffs) : float * int = average_ue_aux(marks, coeffs) in
  58.     if sum_coeffs = 0
  59.     then failwith ("erreur average_ue : somme des coeffs nulle")
  60.     else sum_marks /. float_of_int(sum_coeffs)
  61. ;;
  62.  
  63. (* seconde version avec communiqcation de resultats intermédiaires via des parametres ad hoc *)
  64. let rec average_ue_aux(marks, coeffs, sum_marks, sum_coeffs : float list * int list * float * int) : float * int =
  65.     if marks = []
  66.     then
  67.         if coeffs = []
  68.         then (sum_marks, sum_coeffs)
  69.         else failwith("erreur average_ue_aux : moins de notes que de coeffs")
  70.     else
  71.         if coeffs = []
  72.         then failwith("erreur average_ue_aux : moins de coeffs que de notes")
  73.         else
  74.             let (m, m_r) : float * float list = (fst(marks), rem_fst(marks))
  75.             and (c, c_r) : int * int list = (fst(coeffs), rem_fst(coeffs))in
  76.                 average_ue_aux(m_r, c_r, m *. float_of_int(c) +. sum_marks, c + sum_coeffs)
  77. ;;
  78.  
  79. let average_ue(marks, coeffs : float list * int list) : float =
  80.     let (sum_marks, sum_coeffs) : float * int = average_ue_aux(marks, coeffs, 0.0, 0) in
  81.         if sum_coeffs = 0
  82.         then failwith("erreur average_ue : pas de notes")
  83.         else sum_marks /. float_of_int(sum_coeffs)
  84. ;;
  85.  
  86. (* Q5 et Q6  : liste de (liste de notes) ex: "(float list) list" *)
  87.  
  88. let rec average_stud_aux(marks_stud, coeffs_year : (float list) list * (int list) list) : float*int =
  89. if marks_stud = []
  90. then
  91.     if coeffs_year = []
  92.     then (0.0, 0)
  93.     else failwith("erreur average_stud ; moins de notes que d’UEs")
  94. else
  95.     if coeffs_year = []
  96.     then failwith("erreur average_stud ; moins de coeffs que d’UEs")
  97.     else
  98.         let (mark_ue, rem_mark_ue) : float list * (float list) list = (fst(marks_stud), rem_fst(marks_stud))
  99.         and (coef_ue, rem_coef_ue) : int list * (int list) list = (fst(coeffs_year), rem_fst(coeffs_year))in
  100.             let (mark, nb) : float * int = average_stud_aux(rem_mark_ue, rem_coef_ue) in
  101.                 (mark +. average_ue(mark_ue, coef_ue), nb + 1)
  102. ;;
  103.  
  104. let rec average_stud(marks_stud, coeffs_year : (float list) list * (int list) list) : float =
  105.     let (mark, nb) : float * int = average_stud_aux(marks_stud, coeffs_year) in
  106.         if nb = 0
  107.         then failwith("erreur average_stud : pas de notes")
  108.         else mark /. float_of_int(nb)
  109. ;;
  110.  
  111. (* seconde version avec passage des resultats intermédiaires via les arguments *)
  112. let rec average_stud_aux(marks_stud, coeffs_year, sum, nb : (float list) list * (int list) list * float * int) : float * int =
  113.     if marks_stud = []
  114.     then
  115.         if coeffs_year = []
  116.         then (sum, nb)
  117.         else failwith("erreur average_stud ; moins de notes que d’UEs")
  118.     else
  119.         if coeffs_year = []
  120.         then failwith("erreur average_stud ; moins de coeffs que d’UEs")
  121.         else
  122.             let (mark_ue, rem_mark_ue) : float list * (float list) list = (fst(marks_stud), rem_fst(marks_stud))
  123.             and (coef_ue, rem_coef_ue) : int list * (int list) list = (fst(coeffs_year), rem_fst(coeffs_year))in
  124.                 let mark : float = average_ue(mark_ue, coef_ue) in
  125.                     average_stud_aux(rem_mark_ue, rem_coef_ue, sum +. mark, nb + 1)
  126. ;;
  127.  
  128. let rec average_stud(marks_stud, coeffs_year : (float list) list * (int list) list) : float =
  129.     let (mark, nb) : float * int = average_stud_aux(marks_stud, coeffs_year, 0.0, 0) in
  130.         if nb = 0
  131.         then failwith("erreur average_stud : pas de notes")
  132.         else mark /. float_of_int(nb)
  133. ;;
  134.  
  135. (*Q7 et Q8*)
  136. Non pas de corrections, oublier ces 2 questions.
  137.  
  138. (* si vraiment vous y tenez, mais juste pour envisager l'idée de listes de (liste de (liste de notes))) *)
  139. let rec average(l_marks, coeffs_year : ((float list) list) list * (int list) list) : float list =
  140.     if l_marks = []
  141.     then []
  142.     else
  143.         let (stud, rem_stud) : (float list) list * ((float list) list) list = (fst(l_marks), rem_fst(l_marks)) in
  144.             add_fst(average(rem_stud, coeffs_year), average_stud(stud, coeffs_year))
  145. ;;
  146.  
  147. let rec average_aux(l_marks, coeffs_year, res : ((float list) list) list * (int list) list * float list) : float list =
  148.     if l_marks = []
  149.     then res
  150.     else
  151.         let (stud, rem_stud) : (float list) list * ((float list) list) list = (fst(l_marks), rem_fst(l_marks)) in
  152.             let m : float = average_stud(stud, coeffs_year) in
  153.                 average_aux(rem_stud, coeffs_year, add_lst(res, m))
  154. ;;
  155.  
  156. let rec average(l_marks, coeffs_year : ((float list) list) list * (int list) list) : float list =
  157.     average_aux(l_marks, coeffs_year, [])
  158. ;;
  159.  
  160. (*Q27: Memorisarion dans des listes des termes de la suite de Fibbonacci *)
  161.  
  162. (* pour rappel la corrextion de ex8 du chap4*)
  163. let rec fibonacci_V1_aux(n : int) : int * int =
  164.     if n = 1
  165.     then (1, 1)
  166.     else
  167.         let (prev, cur) : int * int = fibonacci_V1_aux(n-1) in
  168.         (cur, prev + cur)
  169. ;;
  170.  
  171. let fibonacci_V1(n : int) : int =
  172.     if n < 0
  173.     then failwith "erreur fibonacci_V1 : parametre strictement negatif"
  174.     else
  175.         if n = 0
  176.         then 1
  177.         else
  178.             let (prev, cur) : int * int = fibonacci_V1_aux(n) in
  179.             cur
  180. ;;
  181.  
  182. (* mémorisation dans un liste  - ce qui esr demandé ds la Q7 donc - *)
  183. let rec fibonacci_V1_aux(n : int) : int * int * int list =
  184.     if n = 1
  185.     then (1, 1, [1 ; 1])
  186.     else
  187.         let (prev, cur, prevlist) : int * int * int list = fibonacci_V1_aux(n-1) in
  188.             let newval : int = prev + cur in
  189.             (cur, newval, add_lst(prevlist, newval))
  190. ;;
  191.  
  192. let fibonacci_V1(n : int) : int list =
  193.     if n < 0
  194.     then failwith "erreur fibonacci_V1 : parametre strictement negatif"
  195.     else
  196.     if n = 0
  197.     then [1]
  198.     else
  199.         let (prev, cur, fibo) : int * int * int list = fibonacci_V1_aux(n) in
  200.             fibo
  201. ;;
  202.  
  203.  
  204. (* seconde correction, avaec resultat intermédiaire dans les parametres *)
  205. let rec fibonacci_V2_aux(n, i, prev, cur, cur_list :int * int * int * int * int list) : int list =
  206.     if i = n
  207.     then cur_list
  208.     else
  209.         let (new_i, new_prev, new_cur) : int * int * int = (i+1, cur, prev+cur) in
  210.             let new_list : int list = add_lst(cur_list, new_cur) in
  211.                 fibonacci_V2_aux(n, new_i, new_prev, new_cur, new_list)
  212. ;;
  213.  
  214. let fibonacci_V2(n : int) : int list =
  215.     if n < 0
  216.     then failwith "erreur fibonacci_V2 : parametre strictement negatif"
  217.     else
  218.         if n = 0
  219.         then [1]
  220.         else fibonacci_V2_aux(n, 1, 1, 1, [1 ; 1])
  221. ;;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement