Foldlist
Agnishom将挑战而且Lokesh沙玛做出了贡献
破解这个谜
直观上,fold就像用胶水(函数)从一端(左或右)折叠一个链(列表),只产生一个压缩的小东西(输出)。
一个可能的例子是阶乘函数。
计算的阶乘 ,您想从。折叠整数列表 来 用乘法函数。
这实际上是这样的意思:
折叠列表是什么意思
(1 . . n)
与(*)
函数是将其重复应用于两个选定的元素,然后将该函数应用于前一个结果和第三个元素,依此类推。
哦,是的,foldl f z L
程序上可以写成这样
1 2 3 4 |
|
从不同侧面折叠
如果运算符不是结合律,那么结果当然取决于折叠进行的方向。
知道每一张表都写在表格上(a1, a2, a3……一个)
只是句法糖a1, a2, a3::: []
在哪里[]
如果是空列表,下面的插图应该足以解释左右折叠。
请注意, 是用来折叠的函数。 是折叠开始时的初始化值。使用单位元素通常是有用的 .
折叠也可以采用树状的方式,在haskell中定义如下:
1 2 3 4 5 6 7 8 9 |
|
下面的代码很好地说明了三种类型的折叠:
1 2 3 4 5 6 7 8 |
|
Examplar实现
Haskell
在haskell中,我们已经做到了foldl
而且foldr
在前奏中已经定义过了。
一旦我们定义了就定义了
foldt
如上文所述,合并如下
1 2 3 4合并[]y=y合并xs[]=xs合并xs@(x:xt)y@(y:欧美)|x<=y=x:合并xty|否则=y:合并xs欧美
我们可以实现归并排序这种方式:
1 2归并排序::(奥德一个)= >[一个]->[一个]归并排序xs=foldt合并[][[x]|x<-xs]
Python
在python中,减少
功能服务于折叠的目的。此外,初始化值在python中不是强制性的。
可以用以下方式定义阶乘函数:
1的阶乘=λn:减少(λ一个,b:一个*b,xrange(1,n+1))
在Python 3中,减少
函数已从标准库中删除。一个人需要进口functools
使用它。
Ruby
Ruby中的阶乘实现。
1 2 3 4 5 6 7 8def事实全国矿工工会(1..全国矿工工会).注入{|acc,我|acc*我}结束=开始例子:>事实36=结束
引用:Foldlist。Brilliant.org.检索从//www.parkandroid.com/wiki/foldlist/