基于F#延拓的尾部递归

基于F#延拓的尾部递归,f#,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 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

有什么提示吗?

在递归情况下,您需要构造另一个continuation,该continuation接收递归调用的结果,然后调用初始continuation,结果乘以当前值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"
然后


感谢您的输入,但我刚刚注意到原始的
f
包含两个参数。那么,它不应该是
fC n k c=…
?有一个合成
(c)的例子
fT 3 3
> 27

fC 3 3 id
> 27