haskell - 如何在haskell中正确解决帕斯卡三角形?
问题描述
我在 Haskell 中实现 Pascal Triangle,但代码工作不正确。该代码又提供了 1 行。我也试图像一棵树一样打印结果,但这对我来说很困难和困惑,所以我没有添加打印代码。
这些是我得到的结果:
*Main> pascal 1
[[1],[1,1]]
*Main> pascal 2
[[1],[1,1],[1,2,1]]
预期输出:
*Main> pascal 2
[[1],[1,1]]
理想输出:
*Main> pascal 3
1
1 1
1 2 1
这是代码:
choose n 0 = 1
choose 0 k = 0
choose n k = choose (n-1) (k-1)* n `div` k
pascal :: Integer -> [[Integer]]
pascal 0 = [[1]]
pascal m = pascal (m - 1) ++ [[choose m k | k <- [0,1..m]]]
解决方案
首先让我注意到你的方法有点倒退。帕斯卡三角形的全部要点在于它提供了一种有效的方法来将choose
函数制成表格,而无需单独计算每个值。这并不意味着你的做法是错误的,但它肯定不是很好。请尝试在没有该choose
功能的情况下解决问题!你知道,
1
╱ ╲
1 1
╱ ╲+╱ ╲
1 2 1
╱ ╲+╱ ╲+╱ ╲
1 3 3 1
╱ ╲+╱ ╲+╱ ╲+╱ ╲
1 4 6 4 1
... ... ...
提示:不要从编写一个计算整个三角形或单个元素的函数开始,而是先编写一个计算三角形的一行并为您提供下一行的函数。然后剩下要做的就是执行iterate
该功能。
至于如何在您当前的方法中修复它 - 好吧,显然如果您想pascal 1
屈服,[[1]]
那么pascal 0 = [[1]]
就不是一个非常明智的基本案例。而是从_
pascal 1 = [[1]]
或者
pascal 0 = []
(这更好一点,因为函数不会为零定义……但仍然是负数——我们希望避免这种情况,或者至少在这种情况下给出明确的错误消息。)
然后,对于第m
th 行,您应该只计算choose (m-1) k
系列。易于修复。记住还要选择正确的范围k
。
至于如何以漂亮的等腰形状漂亮地打印输出:编写一个辅助函数
centerAlign :: [String] -> [String]
它在每一行的前面添加了空白,与-length
相比,它对应于它所缺少的一半。maximum
length
然后你可以简单地putStrLn . unlines . centerAlign . map show
在帕斯卡三角形上做。
推荐阅读
- angular - Angular Spectator,不能使用自定义匹配器
- python - 如果我将两个不同的词典放入一个列表中。我得到错误的结果。一个字典正在覆盖列表中另一个字典的键/值
- parameters - 跨域跟踪:Ga 链接器参数未出现在 URL 中
- celery - Airflow DAGS 正在运行,但任务未运行/排队 - 发送 Celery 任务时出错:超时
- android - 使用 volley 通过 FCM REST API 发送 POST 请求时出现身份验证错误
- dataweave - 使用 dataweave 匹配 mule 4 中的数组值
- cmake - Cmake - 如何包含仅具有读取权限的路径?
- javascript - Javascript 产量无法正常工作
- python - 从python中的特定图像块中读取文本
- android - 当返回通用类型 * 我得到错误信息不足以推断类型变量 T