Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 制作列表以计算Pascal';Haskell中的s三角形_List_Haskell_Recursion - Fatal编程技术网

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]