我研究哈斯克尔。我遇到的问题是我无法保存中间计算步骤。感觉无效。如何在函数式编程中使用动态编程?
答案 0 :(得分:6)
我遇到[在Haskell中]我无法保存中间问题 计算步骤。
我不知道你曾经学过什么资源,但他们显然不是最好的。
例如:
let
intermediate = {- calculation step -}
in ...
将计算步骤的结果保存在intermediate
中。 (更好:它将变量intermediate
绑定到值。)
此外,引用相关的维基百科条目:
在数学,计算机科学和经济学,动态编程 是一种解决复杂问题的方法 更简单的子问题。它适用于展出的问题 重叠子问题的性质[1]和最优子结构 (如下面所描述的)。适用时,该方法所花费的时间要少得多 比天真的方法。
动态编程背后的关键思想非常简单。一般来说, 要解决一个给定的问题,我们需要解决不同的部分 问题(子问题),然后结合子问题的解决方案 达到整体解决方案。通常,许多这些子问题都是 真的一样。动态编程方法旨在解决每个问题 子问题只有一次,从而减少了计算次数:一次 已经计算了给定子问题的解,存储或者 “memo-ized”:下次需要相同的解决方案时,它很简单 抬起头来。这种方法在数量上特别有用 重复的子问题随着大小的增加呈指数增长 输入。
很明显,Haskell很好地支持这种解决问题的方式。例如,在最简单的情况下,可以携带地图,这可以保留已经解决的子问题及其解决方案。更先进的方法可以使用State Monad。等等。