用函数编程的说法,折叠是一种将列表转换为其他类型值的方法;fold将函数成对应用于列表和累加器的每个元素,然后在列表耗尽时返回累加器。基本折叠是文件夹
:
foldr f a[x1,x2,…,xn]=f x1(f x2(…(f xn a)…))
在这里,(f)是一个有两个参数的函数,一是初始值,并且[x1,x2,…,xn]
是输入列表。姓名文件夹
代表“向右折叠”,因为括号堆叠在展开式的右侧,列表中的项从右到左进行处理,累加器位于二进制函数的右侧。折叠
类似:
foldl f a[x1,x2,…,xn]=(…((f a x1)x2)。。。xn)
参数具有相同的含义,“向左折叠”是指括号堆叠在左侧,列表中的项从左到右进行处理,累加器位于二进制函数的左侧。注意foldl和foldr有不同的类型,因为二进制函数的参数顺序相反。在某些情况下,这会有所不同;例如,当(f)是欺骗
,您必须使用文件夹
。但是当函数是关联的时,例如+
,您可以使用其中之一折叠
或文件夹
。以下是一些示例:
foldr+0[1,2,3,4]→10折叠+0[1,2,3,4]→10折叠图标[][1,2,4]→[1,2,4]foldl cons[][1,2,3,4]→[[[[][],1],2],3],4]foldr plusone 0[1,2,3,4]→4折叠snoc[][1,2,3,4]→[4,3,2,1]
有时没有明显的起始值。例如,如果您想查找列表中的最大项,则没有“保证小于任何其他值”可用于一。在这种情况下,您可以使用文件夹1
和文件夹1
将列表中的第一项作为初始值的变量。在这里,最大值
是一个二进制函数,它接受两个数字并返回较大的数字;它是成对地应用于列表中的每一项(我们忽略了以下事实:最大值
可以接受两个以上的参数):
foldr1最大[1,2,3,4]→4折叠1分钟[1,2,3,4]→1
与相关折叠
是扫描
,这适用折叠
列表的每个初始段:
扫描f a[x1,x2,…,xn]=[a,f(a,x1),f
例如:
扫描+0[1,2,3,4]→[0,1,3,6,10]扫描snoc[][1,2,3,4]→[[],[1],[2,1],[3,2,1],[4,3,2,2]
您的任务是实现上面显示的所有各种折叠;如果您的语言以本机方式提供了它们,那么您应该从基本原则重新实施它们。完成后,欢迎您阅读或运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。
页:1 2