我在创建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
答案 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)
但在我看来,最好将三角形作为行列表。