【问题标题】:Trouble computing recursive value of this function无法计算此函数的递归值
【发布时间】:2020-01-29 09:49:07
【问题描述】:
let rec f (l: int list) : int * int = 
    begin match l with
    | [] -> (0,0)
    | [x] (x,x)
    | x::y::tl -> let (a,b) = f tl in 
                  (x + a, y + b)
    end

let r = f [2;3;4;5;6]

我认为答案将计算为r = (6,6),因为如果您继续在尾部调用递归函数,您将得到列表中的最后一项,因此它将与第二种情况匹配,但是我不知道这是否正确或为什么会这样。真的,我不懂let (a,b) = f tl in (x + a, y + b)的用处。

【问题讨论】:

  • 我建议运行它以找出 r 实际上 是什么,然后从那里返回。
  • 并没有真正的帮助...问题是我真的不明白语法的最后一部分要翻译成什么。
  • 弄清楚了模式,但语法对我来说仍然有点模糊。

标签: function recursion functional-programming ocaml


【解决方案1】:

我会尽力解释let (a, b) = f tl in (x + a, y + b)。也许这会有所帮助。

这种情况的模式是x :: y :: tl。所以这意味着tl代表了列表尾部的尾部。 IE。表示去掉前面两个元素后的列表。

同样,x 代表列表的第一个元素,y 代表第二个元素。

f 的递归调用将返回ftl 返回的任何内容,这就是您要弄清楚的。这将是一对数字,您可以从(a, b) 模式中看出。

整个表达式的结果(这是f 的结果,除非列表很短)是(x + a, y + b)。换句话说,它将列表的第一个元素添加到对的第一个数字中,并将列表的第二个元素添加到对的第二个元素中。

【讨论】:

  • 啊,好吧。所以它递归调用f tl,直到我们得到元组(a,b),然后用它来评估(x + a, y + b)?那么它实际上会返回(10, 11) 作为元组输出吗?
猜你喜欢
  • 2015-07-28
  • 2019-09-03
  • 1970-01-01
  • 2017-05-26
  • 2022-01-20
  • 2022-11-25
  • 2013-11-26
  • 2021-05-03
  • 1970-01-01
相关资源
最近更新 更多