TDA 452型
DIT迪特142
2016年HT

2016年功能编程
第3周的练习

第三周的练习:列表和列表理解

以下是一些练习,旨在帮助您练习使用列表编程并列出理解。

您可能需要以下有用的标准功能:

或::[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.............
计算如下:帕斯卡三角形与二项式定理有关。

定义函数

密码::Int->[Int]
以便帕斯卡语 n个计算n个第个帕斯卡三角形的一行。

4.橡皮糖筛

埃拉托斯特尼筛是一种古老的质数计算方法。开始时间:写出从2到100的所有数字。第一个数字(2)是素数。现在划掉所有2的倍数。剩余的第一个数字(3)是也是素数。划掉3的所有倍数。剩余的第一个数字(5)是也是素数。。。等等。当没有数字时,你已经找到了所有的素数您开始使用的范围内的数字。

定义函数

交叉输出::整数->[整数]->[整数]
以便交叉输出 纳秒删除的所有倍数纳秒.尽量不要实施交叉输出递归地,但是使用列表理解!

现在定义一个(递归!)函数

筛子::[Int]->[Int]
它将埃拉托斯特尼的筛子应用于给定的数字列表,以及返回找到的所有质数的列表。这是一个递归函数与列表作为它的论点,所以你必须注意列表在每次递归调用中都会变小。将空参数列表作为您的基本情况。

使用筛子构建从2到100的素数列表。

5.数字游戏

在这些例子中,我们将研究范围2到100。定义函数假设每一个大于2的偶数都可以表示为两个素数的和。例如,4=2+2,6=3+3,8=3+5。这是真的吗对于4到100之间的所有偶数?

6 (*). 列表中的引用

定义以下函数,并说明其(多态)类型:在上述函数的实现中,尽量不要使用递归,但使用列表理解!

在某些方面,列表就像集合:两者都是元素的集合。但是列表中元素的顺序很重要,而在集合中则无关紧要列表中出现的次数很重要,而在设置。

概念介于列表和集合之间:出现的次数很重要,但元素的顺序并不重要。一种方法表示一个包是一组值对和值的倍数的列表发生:例如

[(“a”,1),(“b”,2)]
定义函数将列表转换为包。例如,
袋子“你好”
应该是
[(‘h’,1),(‘e’,1

7要素和位置

出现在列表中的元素在特定位置执行此操作。例如,“l”出现在位置3和4的“hello”中。定义函数

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.