对于像斐波那契这样的简单问题,编写 CPS相对简单
let fibonacciCPS n =
let rec fibonacci_cont a cont =
if a <= 2 then cont 1
else
fibonacci_cont (a - 2) (fun x ->
fibonacci_cont (a - 1) (fun y ->
cont(x + y)))
fibonacci_cont n (fun x -> x)
但是,在此处的切杆示例 (或算法介绍书)的情况下,闭包的数量并不总是等于 2,并且不能硬编码。
我想必须将中间变量更改为序列。
(我喜欢将延续视为一份合同,上面写着“当你有价值时,把它传给我,然后我会在治疗后把它传给我的老板”或类似的东西,这会推迟实际执行)
对于棒材切割,我们有
//rod cutting
let p = [|1;5;8;9;10;17;17;20;24;30|]
let rec r n = seq { yield p.[n-1]; for i in 1..(n-1) -> (p.[i-1] + r (n-i)) } |> Seq.max
[1 .. 10] |> List.map (fun i -> i, r i)
在这种情况下,我需要附加新创建的延续
let cont' = fun (results: _ array) -> cont(seq { yield p.[n-1]; for i in 1..(n-1) -> (p.[i-1] + ks.[n-i]) } |> Seq.max)
返回子问题的“笛卡尔积”延续。有没有人看过 CPS 版本的切割棒/对此有任何提示?