我正在阅读一些注释,并偶然发现了这段代码,这段代码对我来说非常干净:
# let sigma f m =
let rec sum (i, z) =
if i = m then z else sum(i+1, z+.f i)
in sum(0, 0.0);;
val sigma : (int -> float) -> int -> float = <fun>
# sigma (function k -> float (k*k)) 10;;
- : float = 285.除了有in sum(0, 0.0)的部分外,我什么都懂。问题其实不是关于in关键字,而是这个:sum(0, 0.0)。这意味着什么,为什么这个函数有用?我做了一些谷歌,并从Ocaml网站的in关键字得到了一些东西,但这对我来说毫无意义。这就是我发现的:
class-expr ::= class-path
∣ [ typexpr {, typexpr} ] class-path
∣ ( class-expr )
∣ ( class-expr : class-type )
∣ class-expr {argument}+
∣ fun {parameter}+ -> class-expr
∣ let [rec] let-binding {and let-binding} in class-expr
∣ object class-body end 我不需要解释实际的功能。我需要帮助的是那个微小的in sum(0, 0.0)。
发布于 2013-10-27 20:04:08
它是let绑定in主体;您的in与let rec sum相关。
所以内部
let rec sum (i, z) =
if i = m then z else sum(i+1, z+.f i)
in sum(0, 0.0);;是一个内部尾递归函数来做一个循环,sum(0,0.0)的结果(用那个内部的sum定义)是sigma函数的结果。
sum(0,0.0)是尾递归的起点。
我建议您使用Ocaml的调试器,或者至少添加一个
Printf.printf "sum i=%d z=%f\n";行就在let rec sum(i,z) =行之后。
顺便说一句,你应该用两个参数来编码一个和,而不是用一个单独的参数作为一对:
let rec sum i z =
if i = m then z else sum(i+1) (z+.f i)
in sum 0 0.0;;顺便说一句,我会循环使用减少的i和代码
let sigma f m =
let rec sumloop i s =
(* Printf.printf "sumloop i=%d s=%f\n" i s ; *)
if (i <= 0) then s
else sumloop (i-1) (s+.f i)
in sumloop m 0.0 ;;我同意我的sigma函数略有不同(特别是如果参数f是一个带有副作用的不纯函数)。我将内部尾递归函数命名为sumloop (而不仅仅是sum),以强调它是一个循环。
您的z形式为sum,而我的s形式为sumloop,这是一个累加的部分和。
https://stackoverflow.com/questions/19622842
复制相似问题