Advertisement
Guest User

Untitled

a guest
Nov 7th, 2018
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 3.05 KB | None | 0 0
  1. let new_account p =
  2.   let password = ref p in
  3.   let pass_fail = ref 0 in
  4.   let balance = ref 0 in
  5.   {
  6.     update_passwd = (fun old new_pass -> if old = !password then
  7.                         (password := new_pass; pass_fail := 0)
  8.                       else
  9.                         (pass_fail := !pass_fail + 1; raise wrong_pass)
  10.                          
  11.                     );
  12.    
  13.     retrieve = (fun pass amt -> if !pass_fail < 3 then
  14.                    if pass = !password then
  15.                      (pass_fail := 0;
  16.                       if !balance < amt then
  17.                         raise no_money
  18.                       else
  19.                         balance := !balance - amt)
  20.                    else
  21.                      (pass_fail := !pass_fail + 1; raise wrong_pass)
  22.                  else
  23.                    raise too_many_attempts
  24.                );
  25.    
  26.     deposit = (fun pass amt -> if !pass_fail < 3 then
  27.                   if pass = !password then
  28.                     (pass_fail := 0;
  29.                      balance := !balance + amt)
  30.                   else
  31.                     (pass_fail := !pass_fail + 1; raise wrong_pass)
  32.                 else
  33.                   raise too_many_attempts
  34.               );
  35.    
  36.     print_balance = (fun pass -> if !pass_fail < 3 then
  37.                         if pass = !password then
  38.                           (pass_fail := 0;
  39.                            !balance)
  40.                         else
  41.                           (pass_fail := !pass_fail + 1; raise wrong_pass)
  42.                       else
  43.                         raise too_many_attempts
  44.                     );
  45.   }
  46. ;;
  47.  
  48. let rec catalan_I n =
  49.   let final = ref {num_rec = 1; result = 0} in
  50.   let rec sum f i = match i with
  51.     | 0 -> f 0
  52.     | i -> (final := {num_rec = !final.num_rec + 2; result = !final.result};
  53.             f i + sum f (i - 1))
  54.   in
  55.   let rec catalan n = match n with
  56.     | 0 -> 1
  57.     | 1 -> 1
  58.     | n ->(final := {num_rec = !final.num_rec + 2; result = !final.result};
  59.            sum (fun i -> catalan i * catalan (n - 1 - i)) (n - 1))
  60.  
  61.   in
  62.   let final = ref {num_rec = !final.num_rec; result = catalan n}
  63.   in
  64.   !final
  65. ;;
  66.  
  67. let rec catalan_memo n =
  68.   let rec catalan n = match n with
  69.     | 0 -> 1
  70.     | n -> match Hashtbl.find_opt store n with
  71.       | None ->
  72.           let x = sum (fun i -> catalan i * catalan (n - 1 - i)) (n - 1) in
  73.           Hashtbl.add store n x;
  74.           x
  75.       |Some x -> x
  76.   in
  77.   catalan n
  78. ;;
  79.  
  80. let memo f stats =
  81.   let store = Hashtbl.create 1000 in
  82.   let rec funct n  = match Hashtbl.find_opt store n with
  83.     |None -> (stats.entries := !(stats.entries) + 1;
  84.               let x = f funct n in
  85.               Hashtbl.add store n x;
  86.               x)
  87.     |Some x -> stats.lkp := !(stats.lkp) + 1; x
  88.   in funct
  89.  
  90.  
  91.  
  92. ;;
  93.  
  94.  
  95. let hofstadter_Q  =
  96.   let stats = {entries = ref 0; lkp = ref 0} in
  97.   let rec func g n = match n with
  98.     |1 -> 1
  99.     |2 -> 1
  100.     |n -> g (n - g (n - 1)) + g (n - g(n - 2)) in
  101.   let hofs = memo func stats
  102.   in
  103.   (fun n -> hofs n, stats)
  104. ;;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement