基于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