List 制作列表以计算Pascal';Haskell中的s三角形
我试图创建一个函数,它接受一个整数List 制作列表以计算Pascal';Haskell中的s三角形,list,haskell,recursion,List,Haskell,Recursion,我试图创建一个函数,它接受一个整数m,并返回帕斯卡三角形的行,直到mth行 我已经构造了一个choose函数,它接受两个整数n和k,并返回值n choose k。例如,choose2返回3 到目前为止,我已经 pascal 0 = [1] pascal m = [x | x <- pascal (m-1)] ++ [choose m k | k <- [0,1..m] pascal 0=[1] pascal m=[x | x有解决方案,然后有解决方案。让我们先从解决方案开始,然后逐
m
,并返回帕斯卡三角形的行,直到m
th行
我已经构造了一个choose
函数,它接受两个整数n和k,并返回值n choose k。例如,choose2
返回3
到目前为止,我已经
pascal 0 = [1]
pascal m = [x | x <- pascal (m-1)] ++ [choose m k | k <- [0,1..m]
pascal 0=[1]
pascal m=[x | x有解决方案,然后有解决方案。让我们先从解决方案开始,然后逐步找到解决方案
首先要注意的是,如果我们想要您声称的结果,我们必须更改类型,并进行更多包装:
-- was pascal :: Integer -> [Integer]
pascal :: Integer -> [[Integer]]
pascal 0 = [[1]]
pascal m = [x | x <- pascal (m-1)] ++ [[choose m k | k <- [0,1..m]]]
您会发现,这是在每次递归调用时将单例列表追加到另一个列表的末尾。这是低效的;最好从前面构建列表。因此,我们将使用一种常见的重构:我们将创建一个带有累加器的帮助器
pascal = go [] where
go 0 acc = [1] : acc
go m acc = go (m-1) ([choose m k | k <- [0..m]] : acc)
最后,由于帕斯卡三角形的所有行在其中点对称,您可以尝试构建一个只包含每行前半部分的无限列表。这将有助于消除剩余的“附加到列表末尾”操作。我将此作为一个练习;请记住,行在偶数和奇数元素之间交替,这使得此部分更复杂(也更难看)
pascal = go [] where
go 0 acc = [1] : acc
go m acc = go (m-1) ([choose m k | k <- [0..m]] : acc)
nextRow vs = [1] ++ zipWith (+) vs (tail vs) ++ [1]
allPascals = iterate nextRow [1]