我有一个功能
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
任何提示?
答案 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