Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
4
Task/Ackermann-function/OCaml/ackermann-function-1.ocaml
Normal file
4
Task/Ackermann-function/OCaml/ackermann-function-1.ocaml
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
let rec a m n =
|
||||
if m=0 then (n+1) else
|
||||
if n=0 then (a (m-1) 1) else
|
||||
(a (m-1) (a m (n-1)))
|
||||
4
Task/Ackermann-function/OCaml/ackermann-function-2.ocaml
Normal file
4
Task/Ackermann-function/OCaml/ackermann-function-2.ocaml
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
let rec a = function
|
||||
| 0, n -> (n+1)
|
||||
| m, 0 -> a(m-1, 1)
|
||||
| m, n -> a(m-1, a(m, n-1))
|
||||
8
Task/Ackermann-function/OCaml/ackermann-function-3.ocaml
Normal file
8
Task/Ackermann-function/OCaml/ackermann-function-3.ocaml
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
let h = Hashtbl.create 4001
|
||||
|
||||
let a m n =
|
||||
try Hashtbl.find h (m, n)
|
||||
with Not_found ->
|
||||
let res = a (m, n) in
|
||||
Hashtbl.add h (m, n) res;
|
||||
(res)
|
||||
7
Task/Ackermann-function/OCaml/ackermann-function-4.ocaml
Normal file
7
Task/Ackermann-function/OCaml/ackermann-function-4.ocaml
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
let a m n =
|
||||
for _m = 0 to m do
|
||||
for _n = 0 to n do
|
||||
ignore(a _m _n);
|
||||
done;
|
||||
done;
|
||||
(a m n)
|
||||
11
Task/Ackermann-function/OCaml/ackermann-function-5.ocaml
Normal file
11
Task/Ackermann-function/OCaml/ackermann-function-5.ocaml
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
open Big_int
|
||||
let one = unit_big_int
|
||||
let zero = zero_big_int
|
||||
let succ = succ_big_int
|
||||
let pred = pred_big_int
|
||||
let eq = eq_big_int
|
||||
|
||||
let rec a m n =
|
||||
if eq m zero then (succ n) else
|
||||
if eq n zero then (a (pred m) one) else
|
||||
(a (pred m) (a m (pred n)))
|
||||
30
Task/Ackermann-function/OCaml/ackermann-function-6.ocaml
Normal file
30
Task/Ackermann-function/OCaml/ackermann-function-6.ocaml
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
let rec find_option h v =
|
||||
try Some(Hashtbl.find h v)
|
||||
with Not_found -> None
|
||||
|
||||
let rec a bounds caller todo m n =
|
||||
match m, n with
|
||||
| 0, n ->
|
||||
let r = (n+1) in
|
||||
( match todo with
|
||||
| [] -> r
|
||||
| (m,n)::todo ->
|
||||
List.iter (fun k ->
|
||||
if not(Hashtbl.mem bounds k)
|
||||
then Hashtbl.add bounds k r) caller;
|
||||
a bounds [] todo m n )
|
||||
|
||||
| m, 0 ->
|
||||
a bounds caller todo (m-1) 1
|
||||
|
||||
| m, n ->
|
||||
match find_option bounds (m, n-1) with
|
||||
| Some a_rec ->
|
||||
let caller = (m,n)::caller in
|
||||
a bounds caller todo (m-1) a_rec
|
||||
| None ->
|
||||
let todo = (m,n)::todo
|
||||
and caller = [(m, n-1)] in
|
||||
a bounds caller todo m (n-1)
|
||||
|
||||
let a = a (Hashtbl.create 42 (* arbitrary *) ) [] [] ;;
|
||||
79
Task/Ackermann-function/OCaml/ackermann-function-7.ocaml
Normal file
79
Task/Ackermann-function/OCaml/ackermann-function-7.ocaml
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
open Big_int
|
||||
let one = unit_big_int
|
||||
let zero = zero_big_int
|
||||
let succ = succ_big_int
|
||||
let pred = pred_big_int
|
||||
let add = add_big_int
|
||||
let sub = sub_big_int
|
||||
let eq = eq_big_int
|
||||
let three = succ(succ one)
|
||||
let power = power_int_positive_big_int
|
||||
|
||||
let eq2 (a1,a2) (b1,b2) =
|
||||
(eq a1 b1) && (eq a2 b2)
|
||||
|
||||
module H = Hashtbl.Make
|
||||
(struct
|
||||
type t = Big_int.big_int * Big_int.big_int
|
||||
let equal = eq2
|
||||
let hash (x,y) = Hashtbl.hash
|
||||
(Big_int.string_of_big_int x ^ "," ^
|
||||
Big_int.string_of_big_int y)
|
||||
(* probably not a very good hash function *)
|
||||
end)
|
||||
|
||||
let rec find_option h v =
|
||||
try Some (H.find h v)
|
||||
with Not_found -> None
|
||||
|
||||
let rec a bounds caller todo m n =
|
||||
let may_tail r =
|
||||
let k = (m,n) in
|
||||
match todo with
|
||||
| [] -> r
|
||||
| (m,n)::todo ->
|
||||
List.iter (fun k ->
|
||||
if not (H.mem bounds k)
|
||||
then H.add bounds k r) (k::caller);
|
||||
a bounds [] todo m n
|
||||
in
|
||||
match m, n with
|
||||
| m, n when eq m zero ->
|
||||
let r = (succ n) in
|
||||
may_tail r
|
||||
|
||||
| m, n when eq n zero ->
|
||||
let caller = (m,n)::caller in
|
||||
a bounds caller todo (pred m) one
|
||||
|
||||
| m, n when eq m three ->
|
||||
let r = sub (power 2 (add n three)) three in
|
||||
may_tail r
|
||||
|
||||
| m, n ->
|
||||
match find_option bounds (m, pred n) with
|
||||
| Some a_rec ->
|
||||
let caller = (m,n)::caller in
|
||||
a bounds caller todo (pred m) a_rec
|
||||
| None ->
|
||||
let todo = (m,n)::todo in
|
||||
let caller = [(m, pred n)] in
|
||||
a bounds caller todo m (pred n)
|
||||
|
||||
let a = a (H.create 42 (* arbitrary *)) [] [] ;;
|
||||
|
||||
let () =
|
||||
let m, n =
|
||||
try
|
||||
big_int_of_string Sys.argv.(1),
|
||||
big_int_of_string Sys.argv.(2)
|
||||
with _ ->
|
||||
Printf.eprintf "usage: %s <int> <int>\n" Sys.argv.(0);
|
||||
exit 1
|
||||
in
|
||||
let r = a m n in
|
||||
Printf.printf "(a %s %s) = %s\n"
|
||||
(string_of_big_int m)
|
||||
(string_of_big_int n)
|
||||
(string_of_big_int r);
|
||||
;;
|
||||
Loading…
Add table
Add a link
Reference in a new issue