在继续传递风格和记忆之间进行选择

时间:2013-02-08 21:48:46

标签: f# functional-programming ocaml memoization continuations

在以函数式语言编写memoization和continuation passing style(CPS)函数的示例时,我最终使用了Fibonacci示例。然而,Fibonacci并没有真正受益于CPS,因为循环仍然必须经常以指数方式运行,而memoization它的第一次只有O(n),并且每次都是O(1)。

将CPS和memoization结合起来对Fibonacci有一点好处,但是有一些例子可以说CPS是阻止你用完堆栈的最好方法提高性能以及memoization不是溶液

或者:是否有何时选择其中一个或两者的指南?

1 个答案:

答案 0 :(得分:2)

CPS的一个好处是错误处理。如果你需要失败,你只需要调用你的失败方法。

我认为最大的情况是当你不谈论计算时,记忆很棒。如果您正在谈论IO或其他操作,那么CPS的好处就在那里,但是记忆不起作用。

对于CPS和memoization都适用且CPS更好的实例,我不确定,因为我认为它们具有不同的功能。

最后CPS在F#中略有减少,因为尾递归使得整个堆栈溢出已成为非问题。