【发布时间】:2012-12-12 08:59:37
【问题描述】:
对于像斐波那契这样的简单问题,编写 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)
但是,在here(或书intro to algo)的截杆示例中,闭包的数量并不总是等于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 版本的切杆/对此有任何提示?
【问题讨论】:
-
模式匹配不是更直接吗?
-
最后,我需要在每一步都取一个序列的最大值,所以我看不出它是如何降低噪音的
-
我认为我需要通过“撰写”操作来“收集”子延续
标签: algorithm recursion f# dynamic-programming continuations