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的

我想用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的情况下,我没有fm

如果希望函数返回整数,为什么需要f n?D:
有什么问题吗?提前谢谢。

你忘了
rec

let rec sum n m f=…

对于递归函数,必须手动包含“rec”关键字

  • 必须使用关键字
    let
    来引入一个新函数,如果此函数是递归函数,则必须使用关键字
    let rec

  • 为什么第一个参数名为
    f
    ?如果它是一个函数,则应将其应用于某个对象

  • 如果n=0,那么0
    这是一个多么奇怪的约定!你确定要这样做吗?如果n>m,那么f

  • 目前,您的代码相当于

    let 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