Advertisement
Guest User

Esame 18 05 2015 f#

a guest
Aug 27th, 2015
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 2.65 KB | None | 0 0
  1. (*esercizio 1*)
  2. (*numero di fibonacci ricorsivo*)
  3. let rec fib (n: int): int=
  4.     match n with
  5.     0->1
  6.     |1->1
  7.     |n->fib(n-1)+fib(n-2)
  8.  
  9. let testFib = fib 10
  10. (*numero di fibonacci con ricorsione in coda*)
  11. let fib_tail (n: int): int =
  12.     let rec f a b n =
  13.         match n with
  14.         0->b
  15.         |n->(f b (a+b) (n-1))
  16.     in f 0 1 n
  17.  
  18. let testFibTail = fib_tail 10
  19.  
  20. (*numero di cifre di un dato numero*)
  21. let rec countDigits (n: int): int =
  22.     if -10<n && n<10 then 1
  23.     else 1+ countDigits(n/10)
  24.  
  25. let testCountDigits = countDigits 100
  26.  
  27.  
  28. (*esercizio 1:
  29.  la funzione fib_n_digits è una funzione con ricorsione in coda
  30.  ha tipo int->int e usa usa una funzione interna aux int->int->int
  31.  che a sua volta sfrutta una funzione esterna countDigits int->int
  32.  countDigits viene usata per bloccare le chiamate ricorsive (invariante)
  33.  come in un ciclo while, mentre i due valori a e b equivalgono a :
  34.  -a -> Fibonacci n-2
  35.  -b -> Fibonacci n-1 == Fibonacci n-2 + Fibonacci n-3
  36. *)
  37. let fib_n_digits (n: int): int =
  38.     let rec aux (a: int) (b: int): int =
  39.         if((countDigits b) = n) then b
  40.         else aux b (a+b)
  41.     in aux 0 1
  42.  
  43. let testFibNDigits = fib_n_digits 1
  44.  
  45.  
  46. (*esercizio 2*)
  47. let rec moltiplica (k: int) (n: int): int =
  48.     match n with
  49.     0->0
  50.     |n->k+(moltiplica k (n-1))
  51.  
  52. let testMoltiplica = moltiplica 3 10
  53.  
  54. let rec tab (k: int) (n: int): int list=
  55.     match (k, n) with
  56.     (_,0)->[]
  57.     |(k,n)->tab k (n-1)@[moltiplica k n]
  58.  
  59. let testTab = tab 3 10
  60.  
  61. (*esercizio 3*)
  62. let bellaCifra (n: int): bool =
  63.     match n with
  64.     0|3|7->true
  65.     |_->false;;
  66.  
  67. let bello (n: int): bool = bellaCifra(n%10) && (not(bellaCifra ((n/10)%10)))
  68.  
  69. let testBello= bello 147
  70.  
  71. (*questionario 1*)
  72. let rec g w =
  73.     match w with
  74.     []->0
  75.     |x::y->if (x%2)<>0 then x + (g y) else (g y)
  76. (*g ha tipo int list->int --> risposta C*)
  77.  
  78. (*questionario 2*)
  79. let testG = g [1; 2; 3; 4; 5; 6; 7; 8]
  80. (*g [1; 2; 3; 4; 5; 6; 7; 8] = 16, g calcola la somma degli interi dispari di una lista
  81. di interi --> risposta C*)
  82.  
  83. (*questionario 3*)
  84. let lst = [2;4;7;5;9] = [2;4;7]@[5;9]
  85. (*l'operatore concat @ concatena due liste --> risposta D*)
  86.  
  87. (*questionario 4*)
  88. let rec f (x, y) =
  89.     if x=0 then []
  90.     else y::f(x-1, y)
  91. (*la funzione ha tipo int*'a->'a list, per cui accetta in entrata un coppia come (5, 'a')
  92. che resituitirà una lista del tipo ['a'; 'a'; 'a'; 'a'; 'a'] --> risposta A*)
  93.  
  94. let rec coppialiste (x: (int*int) list): (int list * int list) =
  95.     match x with
  96.     []->([], [])
  97.     |[(x, y)]->([x], [y])
  98.     |(x,y)::xs->(x::fst(coppialiste(xs)), y::snd(coppialiste(xs)))
  99.  
  100. let testcoppialiste = coppialiste([(1,2);(3,4);(5,6)])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement