F#基于延续的尾递归

时间:2017-12-06 16:34:00

标签: f#

我有一个功能

let rec f n = function | 0          -> 1
                       | k when k>0 -> n * (f n (k-1))
                       | _          -> failwith "illegal argument"

它需要int n并将其自身乘以k次。例如:

f 3 3 
val it : int = 27

现在,我已将其重写为尾递归函数,以尝试更好地理解它:

let fT n y = 
    let rec loop acc = function
        | 0          -> 1
        | k when k>0 -> n * (loop acc (k-1))
        | _          -> failwith "illegal argument"
    loop 0 y

我有兴趣使用基于延续的尾递归来做同样的事情,但我有点坚持它应该做的事情:

let rec fC n c = 
    match n with
    | 0          -> c 1
    | k when k>0 -> n * (fC n (fun x -> ...) //Not sure what to do here

任何提示?

1 个答案:

答案 0 :(得分:3)

在递归的情况下,你需要构造另一个继承,它接收来自递归调用的结果,然后调用初始延续,结果乘以当前的n值:

let rec fC n y c =
    match y with
    | 0 -> c 1
    | k when k > 0 -> fC n (k-1) (fun r -> c (n * r))
    | _ -> failwith "illegal argument"

然后

fT 3 3
> 27

fC 3 3 id
> 27