创建pascal三角形时出错

时间:2012-11-13 15:08:03

标签: haskell

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

    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)

请问我帮助我找出错误吗? thnx提前。

saugata

1 个答案:

答案 0 :(得分: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]和第0行[1]连接起来,当pascal 2应用putBetween时,它不是Pascal三角形的一行,结果也不是一个。您还可以通过

获取行的串联
pascal 0 = [1]
pascal n = putBetween (take n previous) ++ previous
  where
    previous = pascal (n-1)

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