gcd, map for ocaml

gcd 的代码如下

1
2
3
4
5
6
7
8
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 ;;

 这个实现不是尾递归的,对于长表来说可能会栈溢出,尾递归的版本为

1
2
3
4
5
6
7
8
9
10
11
12
let map f l =
  let reverse lst r =
    match lst with
        [] -> r
       | h::rest -> reverse rest (h::r)
  in
  let rec map_int f l  r=
    match f with
       [] -> r
      | h::rest -> map_int f rest ((f h)::r)
  in
  reverse (map_int f l []) [] ;;

 仔细观察了一下reverse的代码,其实跟map_int的代码很像,其实是map_int里面函数为identity的特例,于是map可以重新实现为

1 let map f l =
2     let rec map_int g ll rr =
3       match ll with
4       | [] -> rr
5       | h::r -> map_int g r ( (g h) :: rr )
6     in
7     map_int (fun i -> i) (map_int f l []) [] ;;

这样reverse的过程通过map_int来实现

posted on   mathlover  阅读(225)  评论(0编辑  收藏  举报

编辑推荐:
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· 你所不知道的 C/C++ 宏知识
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
阅读排行:
· 不到万不得已,千万不要去外包
· C# WebAPI 插件热插拔(持续更新中)
· 会议真的有必要吗?我们产品开发9年了,但从来没开过会
· 如何打造一个高并发系统?
· 《SpringBoot》EasyExcel实现百万数据的导入导出
< 2012年11月 >
28 29 30 31 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 1
2 3 4 5 6 7 8

导航

统计

点击右上角即可分享
微信分享提示