gpt4 book ai didi

recursion - F# 列表上基于连续的尾递归

转载 作者:行者123 更新时间:2023-12-02 23:47:21 32 4
gpt4 key购买 nike

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

let rec f i = function
| [] -> []
| x::xs -> (x+i)::f (i*i) xs

f 2 [1;2;3]
val it : int list = [3; 6; 19]

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

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]

有什么提示我做错了什么吗?

最佳答案

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

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

这是 CPS 中的函数:

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

当然,它是尾递归。但是您也可以使用累加器而不是延续来将其编写为尾递归:

let f'' i p =
let rec loop i p acc =
match p with
| [] -> acc
| x::xs -> loop (i*i) xs ((x+i)::acc)
loop i p [] |> List.rev

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

关于recursion - F# 列表上基于连续的尾递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47828061/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com