Haskell中的动态规划

Haskell中的动态规划,haskell,dynamic-programming,Haskell,Dynamic Programming,Haskell是否为动态编程提供了工具?在过程语言中,我将使用数组存储基于递归关系的计算。我如何在Haskell中做类似的事情?根据情况有很多不同的方法。也就是说,通常简单的动态规划算法在Haskell中要比在其他语言中简单得多,因为Haskell是懒惰的 考虑斐波那契函数(函数编程的“Hello World”) 现在我们可以观察到 fibs !! n = (map fib [0..]) !! n = = fib ([0..] !! n) = fib n 到目前为止,这对我们没有帮助,但

Haskell是否为动态编程提供了工具?在过程语言中,我将使用数组存储基于递归关系的计算。我如何在Haskell中做类似的事情?

根据情况有很多不同的方法。也就是说,通常简单的动态规划算法在Haskell中要比在其他语言中简单得多,因为Haskell是懒惰的

考虑斐波那契函数(函数编程的“Hello World”)

现在我们可以观察到

fibs !! n
 = (map fib [0..]) !! n =
 = fib ([0..] !! n)
 = fib n
到目前为止,这对我们没有帮助,但我们可以利用这种等价性来发挥我们的优势

fib n | n < 2 = 1
fib n | otherwise = (fibs !! (n-1)) + (fibs !! (n-2)) where
  fibs = map fib [0..]
fib n | n<2=1
fib n |否则=(fibs!!(n-1))+(fibs!!(n-2))其中
fibs=映射fib[0..]

这为Fibonacci函数提供了一个线性时间解决方案(尽管它会泄漏空间…实际上不要这样做),并且只会因为Haskell是懒惰的而起作用。我们根据自身的递归关系定义了一个无限数据结构。奇迹在于,它在有限时间内运行(非严格),在线性时间内运行是按需呼叫的时间最优性(Haskell的成本模型)的产物。这种线性时间性能的原因是,
fibs
中的每个条目最多计算一次(或者可能永远不会)

根据情况,有许多不同的方法。也就是说,通常简单的动态规划算法在Haskell中要比在其他语言中简单得多,因为Haskell是懒惰的

考虑斐波那契函数(函数编程的“Hello World”)

现在我们可以观察到

fibs !! n
 = (map fib [0..]) !! n =
 = fib ([0..] !! n)
 = fib n
到目前为止,这对我们没有帮助,但我们可以利用这种等价性来发挥我们的优势

fib n | n < 2 = 1
fib n | otherwise = (fibs !! (n-1)) + (fibs !! (n-2)) where
  fibs = map fib [0..]
fib n | n<2=1
fib n |否则=(fibs!!(n-1))+(fibs!!(n-2))其中
fibs=映射fib[0..]

这为Fibonacci函数提供了一个线性时间解决方案(尽管它会泄漏空间…实际上不要这样做),并且只会因为Haskell是懒惰的而起作用。我们根据自身的递归关系定义了一个无限数据结构。奇迹在于,它在有限时间内运行(非严格),在线性时间内运行是按需呼叫的时间最优性(Haskell的成本模型)的产物。这种线性时间性能的原因是,
fibs
中的每个条目最多计算一次(或者可能永远不会)

谷歌“haskell动态编程”的第一个热门话题haskell是最好的过程语言之一您可能可以在一个合适的monad中实现相同的代码,只需很少的重大更改。@PeterHall我还没有学习monad-(@epsilonhalbe谢谢你的链接。在这里询问Qs之前,我真的应该听从我自己的建议,做更多的研究。在谷歌的第一个热门网站“haskell动态编程”中,haskell是最好的过程语言之一!)您可能可以在一个合适的monad中实现相同的代码,只需很少的重大更改。@PeterHall我还没有学习monad-(@epsilonhalbe谢谢你的链接。我真的应该遵循我自己的建议,在这里询问Qs之前做更多的研究。