【发布时间】:2013-12-30 00:48:56
【问题描述】:
我是 Haskell 的新手,我喜欢它优美的语法。但是我还没有找到合适的方法来定义一个无限的二维数组——例如,帕斯卡三角:
1 1 1 1 1 ...
1 2 3 4 5 ...
1 3 6 10 15 ...
1 4 10 20 35 ...
1 5 15 35 70 ...
...
我知道如何定义一个简单的函数:
pascal :: Int -> Int -> Int
pascal 1 _ = 1
pascal _ 1 = 1
pascal x y = (pascal (x - 1) y) + (pascal x (y - 1))
由于 Haskell 不记住函数值,调用 pascal 20 20 将需要很长时间。如何定义快速版本(如无限二维数组)?
【问题讨论】:
-
在这两种情况下,您都应该考虑将
Int更改为Integer以避免最终的整数溢出。 -
显然,实际上无法创建无限二维数组。在命令式语言中,您可以拥有一个数据结构(例如 Java 中的
java.util.ArrayList),它由一个按需增长的数组支持,但在 Haskell 中这将是有问题的,因为调整数组的大小会产生副作用。您将能够观察到数组大小的变化。 -
如果你想记住你对
pascal的调用,你可以使用hackage.haskell.org/package/data-memocombinators
标签: haskell