F#列表中基于连续的尾递归

时间:2017-12-15 08:00:09

标签: recursion f#

我有一个非常简单的函数,它接受一个int并将它添加到列表的头部并以i乘以其自身递归调用:

let fC i l =
    let rec loop cont = function
        | []    -> []
        | x::xs -> cont(x+i)::loop (fun acc -> (acc*acc)) xs
    loop id l

fC 2 [1;2;3] //Expected [3;6;19]
val it : int list = [3; 16; 25]

现在,我正在尝试使用延续重写它,但我有点卡住了。这是我到目前为止所提出的:

{{1}}

对我做错了什么提示?

1 个答案:

答案 0 :(得分:5)

看看这些问题和评论,我觉得有些困惑。

尾递归并不一定意味着继续传递风格(CPS)。

以下是CPS中的功能:

<a class="btn" href="@Url.Action("viewList","PMGLists",new { id =this.Request.QueryString["pmgID"] })"><span class="glyphicon glyphicon-circle-arrow-left"></span> Back to PMG List</a>

当然,这是尾递归。但是你也可以通过使用累加器而不是延续来写尾递归:

let f' i p =
    let rec loop i p k =
        match p with
        | []    -> k []
        | x::xs -> loop (i*i) xs (fun a -> k ((x+i)::a))
    loop i p id

另请参阅answer to this question以了解更好的CPS。