0

我在创建帕斯卡三角形时遇到了问题。代码如下。这里sumLstElts将对一行中的元素求和,putBetween会将和放在 [1] 的右侧。pascal n将连续给出一系列帕斯卡序列。

    sumLstElts (x:[])=[x]
    sumLstElts []=[]
    sumLstElts xs=[head xs+head(tail xs)]++sumLstElts (tail xs)

    putBetween xs'= [1]++xs''
            where xs''=sumLstElts xs'

    pascal 0=[1]
    pascal n= putBetween(pascal (n-1)) ++ pascal(n-1)

你能帮我找出我的错误吗?提前谢谢。

绍加塔

4

1 回答 1

1

如果你只想要第 n 行,

pascal n= putBetween(pascal (n-1))

是正确的方法,putBetween已经从给定构造了完整的下一行。如果要将三角形创建为行列表,例如

pascal :: Int -> [[Integer]]
pascal n = take (n+1) $ iterate putBetween [1]

将从第 0 行开始构建三角形。如果您希望三角形的部分以相反的顺序排列,则首先要较长的行,

pascal :: Int -> [[Integer]]
pascal 0 = [[1]]
pascal n = putBetween top : previous
  where
    previous = pascal (n-1)
    top = head previous

这样做。

您尝试的问题在于,putBetween它适用于 的整个结果pascal (n-1),该结果不仅包含n-1-st 行,还包含前面的行。所以pascal 1给出了第一行[1,1]与第零的连接[1],当pascal 2适用putBetween于它时,它不是帕斯卡三角形的一行,所以结果也不是一个。您还可以通过以下方式获得行的串联

pascal 0 = [1]
pascal n = putBetween (take n previous) ++ previous
  where
    previous = pascal (n-1)

但在我看来,最好将三角形作为行列表。

于 2012-11-13T15:15:13.820 回答