OCaml求和

4

我正在尝试在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) m f;; 错误:无限的值和sum没有定义(有指向它的箭头)"
我看了这篇文章:Simple OCaml exercise 虽然是同样的问题,但是有很多其他我没有的东西。 例如,对于我的n = m情况,我没有f n,然后在else情况下,我没有f m。
如果你想让函数返回一个整数,为什么还需要f n呢?D: 问题出在哪里呢?谢谢。

3
顺带一提,您的函数不是尾递归的。它将使用堆栈空间等于数字范围。您可以通过编写一个内部辅助函数来传递累加器,使其成为尾递归函数。请注意不要改变原来的意思。 - newacct
在Ocaml中,(succ n)比(n + 1)更自然。 - Valentine Zakharenko
3个回答

13

你忘记了rec

let rec sum n m f = ...

对于递归函数,你必须手动包含"rec"关键字。


4
  1. 在引入新的函数时,必须使用关键字let,而在该函数为递归函数时,应使用let rec

  2. 为什么第一个参数被命名为f?如果它是一个函数,您应该将其应用于某些内容。

  3. if n = 0 then 0是一种奇怪的约定!您确定您想要这样吗?同样,对于if n > m then 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

不错的信息!我也意识到在测试后,我的函数只是简单地将一个数字相乘。 - Supervisor

0
# 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接