摘要:计算斐波那契数,最简单的计算当然是按照定义来求解了,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的内部过程来模拟循环。
阅读全文
摘要:其实跟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...
阅读全文
摘要: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 ...
阅读全文
摘要: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 ...
阅读全文
摘要:第一个函数式求和,从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的内部函数,他是一个尾递归的函数,编译器会
阅读全文