第三周的练习:列表和列表理解
以下是一些练习,旨在帮助您练习使用列表编程并列出理解。
您可能需要以下有用的标准功能:
或::[Bool]->Bool
- 收益
真的
如果其参数列表的任何元素是真的
. 和::[Bool]->Bool
- 收益
真的
如果其参数列表的每个元素真的
. nub::等式a=>[a]->[a]
- 它从列表中删除重复的元素。
功能结节
在标准库模块中定义数据。列表
:你必须写导入数据。列表
在…的开始任何使用它的Haskell程序。如果你没有时间做所有这些练习,不用担心。这些练习旨在提供足够的练习,以保持最经验丰富的学生很忙。如果你做了所有标有(*)的练习可能理解了本周的内容。
祝你好运!
0(*)。定义列表上的函数
(根据汤普森的书,第7章)答:。前奏曲定义了一个功能拿
哪个是用于从列表中获取给定数量的元素。例如,
take 5“Haskell编程很有趣!”=“Progr”
可能的实现拿
是取::Int->[a]->[a取0 _=[]取_[]=[]取n(x:xs)|n>0=x:take(n-1)xstake __=error“PreludeList.take:负参数”
使用以下定义拿
作为指南执行前奏功能滴
和拆分位置
.B。您如何定义函数拉链3
哪个拉链一起列出三个清单?尝试编写递归定义使用拉链
相反;有什么优点和这两种定义的缺点是什么?
1.排列
A类置换列表的是另一个具有相同元素的列表,但顺序可能不同。例如,[1,2,1]是一个置换[2,1,1]的,但不是[1,2,2]的。编写函数
是置换::等式a=>[a]->[a]->布尔
那就回来了真的
如果它的参数是彼此的排列。表示适当的属性颠倒
排列上下文中的函数。
2.避免重复
(上周重复)在许多情况下,列表不应包含重复元素。对于例如,一组卡片不应包含同一张卡片两次。定义一个功能
重复::Eq a=>[a]->布尔
它返回真的
如果其参数包含重复的元素。
重复[1,2,3,4,5]
False(错误)重复[1,2,3,2]
真的
提示:标准函数元素
,测试是否元素出现在列表中,在这里很有用。
一种方法确保不包含重复项的列表以列出可能包含重复元素的列表,然后删除它们。定义函数
删除重复项::等式a=>[a]->[a]
它返回一个列表,其中包含与其参数相同的元素,但没有重复项。使用以下属性进行测试:prop_duplicates已删除::[整数]->布尔prop_duplicatesRemoved xs=not(重复项(removeDuplicates xs))
此属性是否保证removeDuplicates行为正确?如果没有,缺少什么?
(删除重复项
实际上是一个标准函数,打电话节点
).
3.帕斯卡三角
帕斯卡三角形是一个数字三角形11 11 2 11 3 3 11 4 6 4 11 5 10 10 5 1.............
计算如下:
- 第一行只包含一个1。
- 以下行是通过将中的相邻数字相加来计算的上面的行,并在开始和结束处添加1。
帕斯卡三角形与二项式定理有关。定义函数
密码::Int->[Int]
以便帕斯卡语
n个计算n个第个帕斯卡三角形的一行。4.橡皮糖筛
埃拉托斯特尼筛是一种古老的质数计算方法。开始时间:写出从2到100的所有数字。第一个数字(2)是素数。现在划掉所有2的倍数。剩余的第一个数字(3)是也是素数。划掉3的所有倍数。剩余的第一个数字(5)是也是素数。。。等等。当没有数字时,你已经找到了所有的素数您开始使用的范围内的数字。定义函数
交叉输出::整数->[整数]->[整数]
以便交叉输出
米 纳秒删除的所有倍数米从纳秒.尽量不要实施交叉输出
递归地,但是使用列表理解!现在定义一个(递归!)函数
筛子::[Int]->[Int]
它将埃拉托斯特尼的筛子应用于给定的数字列表,以及返回找到的所有质数的列表。这是一个递归函数与列表作为它的论点,所以你必须注意列表在每次递归调用中都会变小。将空参数列表作为您的基本情况。使用筛子构建从2到100的素数列表。
5.数字游戏
在这些例子中,我们将研究范围2到100。定义函数
- 测试是否n个是质数(范围为2到100)。
- 测试是否n个是两个素数的总和(范围为2到100)。
假设每一个大于2的偶数都可以表示为两个素数的和。例如,4=2+2,6=3+3,8=3+5。这是真的吗对于4到100之间的所有偶数?6 (*). 列表中的引用
定义以下函数,并说明其(多态)类型:
在x xs中发生
,它返回真的
如果x个
是一个元素属于X轴
.所有发生在xs中
,它返回真的
如果的所有元素X轴
也是的元素年
.相同元素xs-ys
,它返回真的
如果X轴
和年
具有完全相同的元素。出现次数x xs
,返回次数x个
发生在X轴
.
在上述函数的实现中,尽量不要使用递归,但使用列表理解!在某些方面,列表就像集合:两者都是元素的集合。但是列表中元素的顺序很重要,而在集合中则无关紧要列表中出现的次数很重要,而在设置。
概念袋介于列表和集合之间:出现的次数很重要,但元素的顺序并不重要。一种方法表示一个包是一组值对和值的倍数的列表发生:例如
[(“a”,1),(“b”,2)]
定义函数袋
将列表转换为包。例如,袋子“你好”
应该是[(‘h’,1),(‘e’,1
7要素和位置
出现在列表中的元素在特定位置执行此操作。例如,“l”出现在位置3和4的“hello”中。定义函数
位置xs
,其将列表转换为元素对的列表,并且他们的立场。提示:使用标准功能拉链
.第一个位置x xs
,其返回x在xs中出现的第一个位置。删除1 x xs
,这将从xs中删除第一个出现的x。对于例子,删除1'l'“hello”==“helo”
删除n x xs
,这将删除xs中出现的前n个x。
8 (*). 更多列表理解
实验该功能对::[a]->[b]->[(a,b)]对xs-ys=[(x,y)|x<-xs,y<-ys]
看看它能做什么。A类毕达哥拉斯三合会是三个整数(一,b条,c(c))这样的话一2+b条2=c(c)2.查找所有毕达哥拉斯三合会一≤b条≤c(c)≤100.