OCaml 第一章练习

文章目录

  • OCaml 第一章练习
    • 最大公约数
    • 奇偶判定
    • 复合函数
    • 函数的n次幂,fnf^nfn
    • 函数快速幂,fn=fn/2(fn/2)f^n=f^{n/2} (f^{n/2})fn=fn/2(fn/2)
    • 统计表达式的计算时间
    • 柯里化和逆柯里化
    • 斐波那契数列
    • 求函数的根,二分查找
    • 牛顿下山法
    • 广义加 fold
    • 积分函数 integrate
    • 第一章疑问

最大公约数

let rec gcd a b =if b = 0 then aelse if a < b the n gcd b aelse gcd b (a mod b);;

奇偶判定

相互递归的使用

let rec even x = if x = 0 then trueelse odd (x-1)
and odd x = if x = 0 then falseelse even (x-1)

复合函数

let (@@) f g = fun x -> f (g x);;
(* 二者等价于 lambda f. lambda g. lambda x. f (g x) *)
let (@@) f g x = f (g x);;

函数的n次幂,fnf^nfn

三者等价。

let (@@) f g x = f (g x);;
(* type = (a' -> b') -> (c' -> a') -> c' -> b' *)
let rec itr n f = let n = 0 then fun x -> xelse f @@ itr (n-1) f
let rec itr n f =if n = 0 then fun x -> xelse fun x -> f (itr (n-1) f x)
(* type = int -> (a' -> a') -> a' -> a' *)
let rec itr n f x =let n = 0 then xelse f (itr (n-1) f x)

函数快速幂,fn=fn/2(fn/2)f^n=f^{n/2} (f^{n/2})fn=fn/2(fn/2)

let sq f x = f (f x);;
let rec itr n f x = if n = 0 then xelse if n mod 2 = 0 then sq (itr (n/2) f) xelse  f (sq (itr (n/2) f) x);;

将 sq 带入得到如下表达式

let rec itr n f x = if n = 0 then xelse if n mod 2 = 0 then (fun f x -> f (f x)) (itr (n/2) f) xelse  f ( (fun f x -> f (f x)) (itr (n/2) f) x );;

统计表达式的计算时间

(* type = (a' -> b') -> a' -> b' *)
let time f x =let t = Sys.time() inlet fx = f x in Printf.printf "Execution time: %fs\n" (Sys.time() -. t);fx;;
(* 使用方法 *)
time (itr 1000000 (fun x -> x*x)) 2;;

柯里化和逆柯里化

let curry f x y = f (x, y);;
(* type = (a' * b' -> c') -> a' -> b' -> c' *)
let uncurry f (x, y) = f x y;;
(* type = (a' -> b' -> c') -> (a' * b') -> c' *)

斐波那契数列

(* 使用了快速幂的itr *)
let fib n = fst (itr n (fun (x, y) -> (y, x+y)) (0, 1));;
(* time fib 50000000 输出时间开销为 3.7s *)(* 简单递归求解 *)
let fib n (x, y) = match n with | 0 -> x| _ -> fib (n-1) (y, x+y);;
(* time (fib 50000000) (0, 1) 输出时间开销为 0.64s *)

快速幂itrfib没有简单递归的fib速度快的原因可能在于itr不是尾递归? 此处存在疑惑。

求函数的根,二分查找

  1. 使用递归
let rec dicho f (a, b) eps = let is_ok (a, b) = abs_float (a -. b) < eps  and do_better (a, b) = let c = (a +. b) /. 2.0 inif (f a) *. (f c) > 0.  then (c, b)else (a, c)in if is_ok (a, b) then (a, b)else dicho f (do_better (a, b)) eps;;let x = dicho (fun x -> cos (x /. 2.0)) (1.0, 5.0) 1e-10;;
  1. 使用 loop循环(其实loop也是递归)
let rec dicho f (a, b) eps = let rec loop p f x = if (p x) then xelse loop p f (f x)and is_ok (a, b) = abs_float (b -. a) < eps  and do_better (a, b) = let c = (a +. b) /. 2.0 in if (f a) *. (f c) > 0.0 then (c, b)else (a, c)in loop is_ok do_better (a, b);;let x = dicho (fun x -> cos (x /. 2.0)) (1.0, 5.0) 1e-10;;

牛顿下山法

xn+1=xn−f(xn)f′(xn),f′(x)=f(x+dx)−f(x)dxx_{n+1}=x_n-\frac{f(x_n)}{f'(x_n)}, f'(x)=\frac{f(x+dx)-f(x)}{dx}xn+1​=xn​−f′(xn​)f(xn​)​,f′(x)=dxf(x+dx)−f(x)​

let newton f x dx eps =let rec loop p f x = if (p x) then x else p f (f x) and is_ok x = (abs_float x) < epsand f' x = (f (x +. dx) -. f x) /. dx in let step x = x -. (f x /. f' x) inloop is_ok step x;;let x = newton (fun x -> log x -. 1.0) 2.7 1e-10 1e-10;;

广义加 fold

(* f 是操作,l 是列表,e 是 f 操作的单位元 *)
let fold f l e =match l with| [] -> e| h :: t -> f h (fold f t e);;let x = fold (fun x y -> x + y) [1;2;3;4;5] 0;;
let x = fold (fun x y -> x * y) [1;2;3;4;5] 1;;

积分函数 integrate

let rec integrate f a b dx res = if abs_float (b -. a) < dx then reselse integrate f (a +. dx) b dx (res +. (f a) *. dx);;let x = integrate (fun x -> 1. /. x) 1. 2. 1e-8 0.;;

第一章疑问

本章的主要问题是关于 itr 表达式,我做了如下的实验:

let sq f x = f (f x);;
let rec itr f n dep x = print_string "cur dep is ";print_int dep;print_string ", n = ";print_int n;if n = 0 then xelse if n mod 2 = 0 then sq (itr f (n/2) (dep+1)) xelse f (sq (itr (n/2) (dep+1)) x;;Printf.printf "2^x = %i\n" (itr 4 (fun x -> x + x) 0 1);;

其输出如下两种情况即同样的代码会有不同的输出

不管是哪种输出都不是我所期望的,我希望的输出是同如下代码的输出结果:

let sq x = x *. x;;
let rec power a n y = print_string "cur dep is ";print_int y;print_string ", n = ";print_int n;print_newline ();if n = 0 then 1.else if n mod 2 = 0 then sq (power a (n/2) (y+1))else a *. sq (power a (n/2) (y+1));;Printf.printf "2.^x = %f\n" (power 2. 4 0);;

其输出如下,是符合期望的。

希望有大佬能解答我的问题TT.

进展:其实itr的输出为如下的二叉树的先序遍历

f4的计算需要f2,f2被算了2次,f2的计算需要f1,每个f2需要算2个f1,一共4个f1,同理f0有8个f^4的计算需要f^2,f^2被算了2次,f^2的计算需要f^1,每个f^2需要算2个f^1,一共4个f^1,同理f^0有8个f4的计算需要f2,f2被算了2次,f2的计算需要f1,每个f2需要算2个f1,一共4个f1,同理f0有8个。​

原因:λ\lambdaλ演算的β\betaβ归约只做替换,不存储中间结果?

OCaml 第一章习题相关推荐

  1. 怎样写C代码——《狂人C》习题解答1(第一章习题7)

    自打小学开始,人们就被告知,做题之前应该先审题.这道理虽然很浅显,但却无比重要.     然而正是由于这道理过于浅显,所以总免不了被轻视--甚至被遗忘.人类历史上发生过无数次因为轻视简单浅显的道理而招 ...

  2. 从硬盘上把数据传回到计算机称为什么,计算机基础知识 第一章 习题三

    计算机基础知识第一章习题三 一.填空题 1. 高级语言不能直接被计算机识别并执行,必须翻译成机器语言,翻译的方式有两种:一种是编译方式,另一种是方式. 2. 计算机中存储数据的最小单位是:存储容量的基 ...

  3. 计算机网络原理第一章习题3-24 3-25

    计算机网络原理第一章习题 3-24假定站点A和B在同一个10Mb/s以太网网段上.这两个站点之间的传播时延为225比特时间.现假定A开始发送一帧,并且在A发送结束之前B也发送一帧.如果A发送的是以太网 ...

  4. 计算机文化基础第一章知识点题,计算机文化基础第一章习题与答案

    <计算机文化基础第一章习题与答案>由会员分享,可在线阅读,更多相关<计算机文化基础第一章习题与答案(8页珍藏版)>请在人人文库网上搜索. 1.计算机文化基础第一章习题与答案1 ...

  5. 网络空间安全导论-第一章习题

    网络空间安全导论-第一章习题 1.网络空间安全有哪些定义? 2.简述网络安全空间的技术架构. 3.列举一些你身边遇到或发现的网络安全问题,试分析其中的原因,并说说有哪些防范措施. 1.网络空间安全有哪 ...

  6. 工程伦理 第一章习题 答案

    工程伦理第一章习题 答案 此篇为第一章,后续链接如下: 第二章 https://blog.csdn.net/qq_41158852/article/details/111821587 第三章 http ...

  7. 电力电子技术(第一章习题)

    电力电子技术(第一章习题) 1-1.下图为晶闸管导通时电流波形,各电流最大值为,试求各波形的电流平均值.电流有效值以及波形系数. (1) (2) (3) 1-2. 上题中不考虑安全裕量,额定电流的晶闸 ...

  8. 如何写好科研论文 (第一章习题 Quiz 1)

    如何写好科研论文 第一章习题 Quiz 1 如何写好科研论文 1 选择题 2 讨论题 1 选择题 1 ABC 2 ABCD 3 ABD 4 ABCD 5 ABCD 2 讨论题 1.如何去选取第一批要阅 ...

  9. 工程伦理第一章习题答案

    工程伦理 第一章习题 工程伦理 1 单选题 2 简答题 2.1 主观题 2.2 讨论题 1 单选题 1-4 BABD 5 ACD 6 ABCD 7 ABCD 8 A 9 BCD 10 ABD 11 √ ...

最新文章

  1. 写个自己的Xcode4插件(二)
  2. 在flask上使用websocket
  3. easyui左侧导航菜单右侧载入百度地图项目框架
  4. 电子商务的五个技术研发方向
  5. codeigniter 禁止ip登录_「开源资讯」baigo SSO v4.0 beta-3 发布,单点登录系统
  6. unix grep命令的大致实现
  7. c#中bin,obj,properties文件夹的作用
  8. 对一次通过CISSP考试的建议
  9. CDI services--Decorators(装饰器)
  10. block介绍(四)揭开神秘面纱(下)
  11. c++用什么软件_html用什么软件编写
  12. 连续型随机变量量函数的期望
  13. PDF、图片、合并、转化工具
  14. c语言随机抽号小程序源代码,使用JS编写的随机抽取号码的小程序
  15. k3安装服务器系统,论如何逗比的在2008R2上安装金蝶K3服务器
  16. Word论文排版之样式的使用
  17. 服务器装系统报0x0000005d,虚拟机安装Win8开机黑屏提示0x0000005D错误如何解决
  18. Matlab绘制运动想象ERD/ERS分析法图像
  19. vcs_dve+sverilog
  20. linux文件系统自动挂载点,Linux fstab自动挂载分区教程

热门文章

  1. oracle saiku_Apache Kylin | Saiku + Kylin 搭建多维 OLAP 平台
  2. wikioi之1160 蛇形矩阵 之找规律
  3. 豆豆。。。豆豆。。。
  4. 【历史上的今天】3 月 20 日:cURL 二十五周年;Docker 发布;思科收购 Linksys
  5. 用asp.net开发搜索引擎???
  6. Mysql基础——表操作
  7. 小程序开发之删除数组中某个元素
  8. rdp协议服务器会反连客户端吗,反向RDP攻击:RDP客户端上的代码执行
  9. 拥抱机器视觉新蓝海,冀为好望开启数字经济发展新“冀”遇
  10. 概率统计Python计算:连续型随机向量边缘分布或条件分布概率计算