11 2012 档案

compute the n'th fibonacci number in Ocaml
摘要:计算斐波那契数,最简单的计算当然是按照定义来求解了,f0=0, f1=1, fn = fn-1 + fn-2。直接递归实现的话效率比较地下,可以考虑使用迭代的方法来求解。代码如下1 let fib n =2 let rec fib_int a b count =3 if count = 1 then a else fib_int (a+b) a (count-1)4 in5 if n = 0 then 0 else fib_int 1 0 n ;;里面使用了一个fib_int的内部过程来模拟循环。 阅读全文

posted @ 2012-11-26 21:31 mathlover 阅读(297) 评论(0) 推荐(0)

qsort for ocaml
摘要:其实跟scheme很类似的表操作,实现起来也比较容易。1 let rec qsort cmp lst =2 match lst with3 | [] -> []4 | h::r ->5 let less = List.filter (fun i -> (cmp i h) < 0) r in6 let great = List.filter (fun i -> not ((cmp i h) < 0)) r in7 (qsort cmp less) @ ( h::(qsort cmp gre... 阅读全文

posted @ 2012-11-26 19:46 mathlover 阅读(170) 评论(0) 推荐(0)

filter in Ocaml
摘要:1 let filter p l = 2 let rec filter_int g ll rr = 3 match ll with 4 | [] -> rr 5 | h::r -> if (g h) then filter_int g r (h::rr) else filter_int g r rr 6 in 7 let rec map_int g ll rr = 8 match ll with 9 | [] -> rr10 | h::r -> map_int ... 阅读全文

posted @ 2012-11-25 19:04 mathlover 阅读(214) 评论(0) 推荐(0)

gcd, map for ocaml
摘要:gcd 的代码如下let gcd a b = let rec gcd_int x y = let r = x mod y in if r = 0 then y else gcd_int y r in if b = 0 then a else gcd_int a b ;;map的简单实现为let rec map f = [] -> [] |h::l -> f h :: map f l ;;这个实现不是尾递归的,对于长表来说可能会栈溢出,尾递归的版本为let map f l = let reverse lst r = match lst with ... 阅读全文

posted @ 2012-11-25 11:03 mathlover 阅读(235) 评论(0) 推荐(0)

几个简单函数的实现,就当做是ocaml练习用的
摘要:第一个函数式求和,从i到j求和,这里假定i是下限,j是上限let rec sum i j = if i > j then 0 else i + (sum (i+1) j) ;;这个递归实现很简单,但是由于不是尾递归的,所以编译器不能转成迭代来计算,当递归层数太高的情况下stack会溢出,稍微修改一下,可以改成递归版本let sum i j = let rec sum_int i j s = if i > j then s else sum_int (i+1) j (s+i) in sum_int i j 0 ;;这里定义了一个sum_int的内部函数,他是一个尾递归的函数,编译器会 阅读全文

posted @ 2012-11-24 19:58 mathlover 阅读(555) 评论(0) 推荐(0)

导航