It seems that I cannot assign an abstract value to ref, and I'm not sure what to do.
open Big_int let largest = ref zero_big_int;; let depth = ref zero_big_int;; let rec big i = (add_int_big_int i zero_big_int) and collatz = fun num depth -> print_endline (string_of_big_int num); (if(eq_big_int (add_int_big_int (-1) num) zero_big_int)then(depth)else( if eq_big_int (mod_big_int num (big 2)) zero_big_int then (collatz (div_big_int num (big 2)) (succ_big_int depth)) else (collatz (succ_big_int (mult_int_big_int 3 num)) (succ_big_int depth)))) and euler14 i = print_endline (string_of_big_int i); (if(lt_big_int i (big 1000000))then ( let ret = (collatz i unit_big_int) in if(ret> !depth)then (largest:=i;depth:=ret; (euler14 (succ_big_int i))) else (euler14 (succ_big_int i)) ) else (!largest));; print_endline (string_of_big_int (euler14 (big 2)));;
The code seems to crash when I try the greatest: = me and depth: = ret, which are Big_nums. Is there any way around this?
2 2 1 3 3 10 5 16 8 4 2 1 Fatal error: exception Invalid_argument("equal: abstract value")
source share