v17*_*v17 -1 recursion haskell pascals-triangle
我正在 Haskell 中实现 Pascal Triangle,但代码没有以正确的方式工作。该代码又给出了 1 行。我也试图像树一样打印结果,但这对我来说很困难和困惑,所以我没有添加打印代码。
这些是我得到的结果:
*Main> pascal 1
[[1],[1,1]]
*Main> pascal 2
[[1],[1,1],[1,2,1]]
Run Code Online (Sandbox Code Playgroud)
预期输出:
*Main> pascal 2
[[1],[1,1]]
Run Code Online (Sandbox Code Playgroud)
理想输出:
*Main> pascal 3
1
1 1
1 2 1
Run Code Online (Sandbox Code Playgroud)
这是代码:
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]]]
Run Code Online (Sandbox Code Playgroud)
首先让我注意到你的方法有点倒退。帕斯卡三角形的全部意义在于,它提供了一种无需独立计算每个值即可将choose函数制表的有效方法。这并不意味着你这样做的方式是错误的,但它肯定不是很好。尝试在没有功能的情况下解决问题!你懂,choose
1
? ?
1 1
? ?+? ?
1 2 1
? ?+? ?+? ?
1 3 3 1
? ?+? ?+? ?+? ?
1 4 6 4 1
... ... ...
Run Code Online (Sandbox Code Playgroud)
提示:不要从编写一个计算整个三角形或单个元素的函数开始,而是编写一个函数,它取三角形的一行并为您提供下一行。然后剩下要做的就是iterate调用该函数。
至于如何在您当前的方法中修复它 - 好吧,显然,如果您想pascal 1让步,[[1]]那么这pascal 0 = [[1]]不是一个非常明智的基本案例。相反,开始用
pascal 1 = [[1]]
Run Code Online (Sandbox Code Playgroud)
或者
pascal 0 = []
Run Code Online (Sandbox Code Playgroud)
(这要好一点,因为函数不会为零未定义......但仍然是负数 - 我们希望避免这种情况或至少在这种情况下给出明确的错误消息。)
然后,对于第mth 行,您应该只计算choose (m-1) k系列。易于修复。记住还要为 选择正确的范围k。
至于如何以漂亮的等腰形状漂亮地打印输出:编写一个辅助函数
centerAlign :: [String] -> [String]
Run Code Online (Sandbox Code Playgroud)
它在每行前面添加了空格,对应于length与maximum-相比所缺少的一半length。
然后你可以简单地putStrLn . unlines . centerAlign . map show在帕斯卡三角形上做。