OCaml求和
我想用OCaml做一个函数,在数学中做求和函数。 我试过这个:OCaml求和,ocaml,Ocaml,我想用OCaml做一个函数,在数学中做求和函数。 我试过这个: sum n m f = if n = 0 then 0 else if n > m then f else f + sum (n + 1) m f;; 但是,我得到了一个错误——“字符41-44:else f*sum(n+1)mf;;错误:未绑定值sum 总和加下划线(用胡萝卜符号表示) 我看了这个, 这是同一个问题,但我看到了很多我没有的东西。 例如,对于我的n=m的情况,我没有fn,而在else的
sum n m f =
if n = 0 then 0
else if n > m then f
else f + sum (n + 1) m f;;
但是,我得到了一个错误——“字符41-44:else f*sum(n+1)mf;;错误:未绑定值sum
总和加下划线(用胡萝卜符号表示)
我看了这个,
这是同一个问题,但我看到了很多我没有的东西。
例如,对于我的n=m的情况,我没有fn,而在else的情况下,我没有fm
如果希望函数返回整数,为什么需要f n?D:
有什么问题吗?提前谢谢。你忘了
rec
let rec sum n m f=…
对于递归函数,必须手动包含“rec”关键字
let
来引入一个新函数,如果此函数是递归函数,则必须使用关键字let rec
f
?如果它是一个函数,则应将其应用于某个对象如果n=0,那么0
这是一个多么奇怪的约定!你确定要这样做吗?如果n>m,那么flet sum a b c =
if a = 0 then 0
else if a > b then c
else if a < 0 then min (-a*c) ((b-a+1)*c)
else (b-a+1)*c
求和a b c=
如果a=0,则为0
否则,如果a>b,则c
否则,如果a<0,则最小(-a*c)((b-a+1)*c)
其他(b-a+1)*c
在一个不相关的注释中,您的函数不是尾部递归函数。它将使用与数字范围相等的堆栈空间。您可能希望通过使用一个传递累加器的内部辅助函数使其尾部递归(succ n)比(n+1)更自然在OcamlNice info!中,我也意识到我的函数只是在测试后才真正乘以一个数字。
# let rec sum c = function
(0,_) -> 0
| (n,m) when n>m -> c
| (n,m) -> c + sum c (n+1,m)
;;
# sum 2 (3,5);;
- : int = 8