1、第三章 链表和矩阵链表和矩阵是 MMP 的两个基本数据类型,本章将分别就这两个主题介绍相关的基本运算指令。3.1 链表的运算1. append调用:append (list, atom)参数:list 是一个表atom 是一个元素说明:若 atom 不在 list 中,则将 atom 加到 list 的最后,形成新表返回,否则,返回原表。示例:append (1,2,3,4,5);1,2,3,4,5append (1,2,3,4,4);1,2,3,4 append (a,b,c,d,e,f);a,b,c,d,e,f2. insert调用:insert(list, atom, pos)参数:li
2、st 是一个表atom 是一个元素pos 是一个正整数说明:将元素 atom 插入到表 list 的第 pos 个元素之前,形成新表返回。若表 list 的长度为 n,则 1insert(1,2,3,4,a,1);a,1,2,3,4insert(a,b,c,d,c,d,2);a,c,d,b,c,dinsert(1,2,3,4,a,5);1,2,3,4,a3. merge 调用:merge(l1,l2)参数:l1 是一个表l2 是一个表说明:链表的合并,即把链表 l2 的结点直接插入链表 l1 的表尾,形成新表返回。示例:merge(1,2,3,3,4,5);1,2,3,3,4,54. firs
3、t调用:first(list)参数:list 是一个表说明:返回表 list 中的第一个元素示例:first(10,20,30,40);105. last调用:last(list)参数:list 是一个表说明:返回表 list 中的最后一个元素示例:last(10,20,30,40);406. rest调用:rest(list)参数:list 是一个表说明:返回将表 list 中的第一个元素去掉后形成的表示例:rest(1,2,3,4);2,3,4rest(a);7. part调用:part(list, pos)参数:list 是一个表pos 是一个正整数说明:返回表 list 中的第 pos
4、 个元素, pos 从 1 开始计数。示例:part(10,20,30,40,3);30part(a,b,c,e,f,4);e,f8. find调用:find(atom, list)参数:atom 是一个元素list 是一个表说明:检查元素 atom 是否在表 list 中。如果 atom 在 list 中,返回它在 list 中第一次出现的位置(索引值) ;否则返回 0。示例:find(a,1,2,a,b,c,a);3find(a,b,1,2,a,b,3,a,b);3find(a,1,2,3,4);09. replace调用:replace (list, atom, pos)参数:list
5、是一个表atom 是一个元素pos 是一个正整数说明:将表 list 的第 pos 个元素替换为元素 atom,形成新表返回。示例:replace(1,2,3,4,a,1);a,2,3,4replace(a,b,c,d,c,d,2);a,c,d,c,d10. equal调用:equal (list1, list2)参数:list1 是一个表list2 是一个表说明:判断表 list1 和表 list2 是否相等, 相等则返回 1,不相等则返回 0。示例:equal(1,2,3,4,1,2,3,4);1equal(a,b,c,d,c,d,a,b);011. union调用: union(list
6、1,list2)参数: list1 是一个表list2 是一个表说明: 返回表 list1 和表 list2 的并集示例:union(1,2,3,4,2,3,6,7);1,2,3,4,6,712. intersect调用: intersect(list1,list2)参数: list1 是一个表list2 是一个表说明: 返回表 list1 和表 list2 的交集示例:intersect(1,2,3,4,2,3,6,7);2,313. minus调用: minus(list1,list2)参数: list1 是一个表list2 是一个表说明: 返回表 list1 和表 list2 的差集示例
7、:minus(1,2,3,4,2,3,6,7);1,414. inverse调用: inverse(list)参数: list 是一个表说明: 返回表 list 的逆表示例:inverse(1,2,3,4);4,3,2,115. remove调用:remove(list,pos)参数:list 是一个表pos 是一个正整数说明:删除表 list 的第 pos 个元素,形成新表返回。示例:remove(10,20,30,40,3);10,20,40remove(10,20,30,40,0);1,2,3,416. issub调用:issub(list1,list2)参数:list1 是一个表lis
8、t2 是一个表说明:如果 list1 是 list2 的子表,则返回 1,否则返回 0。list1=list2 时,返回 1。示例:issub(1,2,3 ,1,2,3,4,5,6,7);1issub(1,2,3 ,1,2,3);1issub(1,2,3 ,2,3,4);03.2 矩阵的运算 1. matrix调用:matrix(v,h,l)参数:v 是一个整数h 是一个整数l 是一个数据列表说明:这个函数是用来构造一个 v 行 h 列的矩阵,矩阵中的元素由列表 l 给出。如果列表 l 给出的元素个数不足 v*h 个,那么缺少的元素个数将会用 0 来填充;如果列表 l 给出的元素个数超过了 v
9、*h 个,则会提示出现错误。返回值是这个构造好的矩阵。示例:a:=matrix(3,3,1,2,3,4,5,6,7,8,9); (下同)matrix(1,2,3;4,5,6;7,8,9)2. det调用:det(a)参数:a 是一个矩阵说明:计算一个矩阵的行列式。返回值是某一种特定的数据类型,根据 a 的数据类型不同而不同。示例:det(a);0b:=matrix(3,3,x,y,z,2*x,y,0,0,2*x,y);det(b);4*z*x2-y2*xc:=matrix(3,3,x2,y-3,z2*x-y2,12,x5*y,y*z,3*z,0,y4*x);det(c);y5*x8-3*z3*
10、y*x6+3*z*y3*x5-12*y5*x+36*y4*x+3*z2*y2-9*z2*yd:=matrix(4,4,32,42,11,32,121,18,43,6,4,12,17,62,3,42,12,44);det(d);19830243. tran调用:tran(a)参数:a 是一个矩阵说明:计算一个矩阵的转置,所谓一个矩阵的转置,就是让矩阵中的元素行列交换,即 aij变换成 aji。返回值是一个矩阵。示例:tran(a);matrix(1,4,7;2,5,8;3,6,9)4. coldim调用:coldim(a)参数:a 是一个矩阵说明:计算一个矩阵的列数。返回值是一个整数。示例:co
11、ldim(a);35. rowdim调用:rowdim(a)参数:a 是一个矩阵说明:计算一个矩阵的行数。返回值是一个整数。示例:rowdim(a);36. submatrix调用:submatrix(a,v1,v2,h1,h2)参数:a 是一个矩阵v1 是一个整数v2 是一个整数h1 是一个整数h2 是一个整数说明:计算一个矩阵的子矩阵,v1,v2 是行的范围,h1,h2 是列的范围。返回值是一个矩阵。示例:submatrix(a,1,2,1,2);matrix(1,2;3,4)7. submatrix调用:submatrix(a,l1,l2)参数:a 是一个矩阵l1 是一个列表l2 是一个
12、列表说明:计算一个矩阵的子矩阵, l1 是行的列表,l2 是列的列表,子矩阵中(i,j)上的元素是 a(l1i,l2j)。返回值是一个矩阵。示例:submatrix(a,3,1,2,1,2);matrix(7,8;1,2;4,5)8. submatrix调用:submatrix(a,v1,v2,l)参数:a 是一个矩阵v1 是一个整数v2 是一个整数l 是一个列表说明:计算一个矩阵的子矩阵, v1,v2 是行的范围, l 是列的列表。返回值是一个矩阵。示例:submatrix(a,2,3,3,1);matrix(6,4;9,7)9. submatrix调用:submatrix(a,l,h1,h
13、2)参数:a 是一个矩阵l 是一个列表h1 是一个整数h2 是一个整数说明:计算一个矩阵的子矩阵, l 是行的列表,h1,h2 是列的范围。返回值是一个矩阵。示例:submatrix(a,3,1,2,1,2);matrix(7,8;1,2;4,5)10. swaprow调用:swaprow(a,v1,v2)参数:a 是一个矩阵v1 是一个整数 v2 是一个整数说明:把矩阵 a 中第 v1 行和 v2 行的元素进行交换。返回值是一个矩阵。示例:swaprow(a,1,2);matrix(4,5,6;1,2,3;7,8,9);11. swapcol调用:swapcol(a,h1,h2)参数:a 是
14、一个矩阵h1 是一个整数h2 是一个整数说明:把矩阵 a 中第 h1 列和 h2 列的元素进行交换。返回值是一个矩阵。示例:swapcol(a,1,2);matrix(2,1,3;5,4,6;8,7,9);12. row调用:row(a,b)参数:a 是一个矩阵b 是一个整数说明:求一个矩阵 a 的第 b 行,并构造成一个子矩阵。返回值是一个矩阵。示例:row(a,2);matrix(4,5,6)13. row调用:row(a,b,c)参数:a 是一个矩阵b 是一个整数c 是一个整数说明:求一个矩阵 a 的以 b,c 为范围的那些行。返回值是一个矩阵。示例:row(a,1,2);matrix(
15、1,2,3;4,5,6)14. col调用:col(a,b)参数:a 是一个矩阵b 是一个整数说明:求一个矩阵 a 的第 b 列。返回值是一个矩阵。示例:col(a,3);matrix(3;6;9)15. col调用:col(a,b,c)参数:a 是一个矩阵b 是一个整数c 是一个整数说明:求一个矩阵 a 的以 b,c 为范围的那些列。示例:col(a,2,3);matrix(2,3;5,6;8,9)16. lsolve调用:lsolve(ps,var)参数:ps 是一个多项式列表var 是一个变量列表说明:求解以多项式列表 ps 和变量列表 var 所定义的线性方程组的根。返回值是一个解的列
16、表。示例:为了求解线性方程组: 351864723zyx即: 0318645723zyx我们可以按照下面的方法求解:a:=3*x+2*y-7*z-5,4*x+6*y-18*z+33; b:=x,y,z; lsolve(a,b);(3*z+48)/(5),(26*z-119)/(10),z这里表示: ,z 是自由变量。zyx10/)926(548317. lsolve_m调用:lsolve_m(a)参数:a 是一个矩阵说明:把这个矩阵当作一个线性方程组的增广矩阵,然后求解这个线性方程组。返回值是一个列表,显示所得到的解。 示例:为了求解线性方程组: 1730265144321x我们可以得到这个线性方程组的增广矩阵为: 17302651因此我们可以按照下面的方法求解:a:=matrix(4,5,3,-5,7,1,1,2,-1,4,3,1,1,5,5,6,1,-2,0,3,7,1);lsolve_m(a);x1 = 11/57x2 = -9/133x3 = -1/57x4 = 82/399