【问题标题】:Ocaml : function that two integers and returns the list of all integers in the rangeOcaml:两个整数的函数并返回范围内所有整数的列表
【发布时间】:2011-11-05 08:59:02
【问题描述】:

这个函数接受两个整数并返回[a,b]范围内所有整数的列表

这是我写的解决方案。

let rec range_rec l a b = 
  if (a=b) then l@[b]
  else range_rec (l@[a], a+1, b);;

let range a b = range_rec [] a b;;

我遇到了一个错误“错误:此表达式的类型为 int list * int * int 但表达式应为 int 类型”。有人能解释一下我为什么会收到这个错误吗?

谢谢。

【问题讨论】:

  • 你认为“循环”会做什么?
  • 对不起,克里斯。那是一个错字。我试图让它更清楚。

标签: ocaml


【解决方案1】:

为了改进 gasche 已经提出的解决方案,可以将其设为尾递归。

let int_range a b =
  let rec int_range_rec l a b =
    if a > b then l
    else int_range_rec (b :: l) a (b - 1)
  in (int_range_rec [] a b);;

【讨论】:

    【解决方案2】:

    应该是这样的:

    let rec range_rec l a b = 
      if a = b then l @ [b]
      else range_rec (l @ [a]) (a + 1) b;;
    
    let range a b = range_rec [] a b;;
    

    我做了什么:

    1. loop 更改为range_rec
    2. (l@[a], a+1, b) 更改为(l @ [a]) (a + 1) b。第一个是三元组,第二个是柯里化函数的 3 个参数。
    3. 注意if (a = b) then可以写成if a = b then

    最后,通过“向后”循环使用:: 而不是@,可以提高函数的效率。例如像gasche所展示的那样。

    【讨论】:

    • 对不起。第一次更改实际上是一个错字。但它在实际程序中并不存在。你的意思是说,我必须在 (a+1) 周围加上额外的大括号,并且我必须删除围绕 3 个参数的大括号?这是为什么呢?
    • @Sunday Something ala let rec f (a, b) = 是一个在 Ocaml 中采用元组的函数。其中let rec f a b =实际上是一个函数,它返回一个函数。它不像 C 语言。请参阅 files.metaprl.org/doc/ocaml-book.pdfcaml.inria.fr/pub/docs/oreilly-book/ocaml-ora-book.pdf 中的“函数” - 很难在短时间内解释类型系统和函数 :)
    • 谢谢拉塞。我不能给你的答案声誉,因为我是新手。我希望有人给它。
    【解决方案3】:

    从性能的角度来看,l @ [elem] 操作很糟糕:因为a @ ba 的长度上是线性的,所以在列表末尾添加一个元素在列表的长度上是线性的,使你的整个@ 987654324@ 在|b-a| 中定义二次方。可行的方法是更改​​您的代码,以便您可以改用恒定时间elem::l 操作。

    let rec range a b =
      if a > b then []
      else a :: range (a + 1) b
    

    您可以进行额外的优化,例如使其尾递归,但至少该解决方案的复杂性是正确的。

    【讨论】:

    • 好建议,但您还没有回答问题。
    • 谢谢加什。知道为什么我的函数会出错吗?
    • @Chris:有时人们会对超出明确要求的答案感兴趣。 lasseespeholt 已经提出了对句法错误的修复。如果您有兴趣详细解释为什么f (x, y, z)f x y z 的输入方式不同,请这样做。
    • 谢谢加什。我不能给你的答案声誉,因为我是新手。我希望有人给它
    猜你喜欢
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 2015-04-29
    • 2011-11-04
    • 2012-09-13
    • 2015-03-21
    相关资源
    最近更新 更多