【程序设计】4.3 [排成队] 多层序列

4.3 多层序列

序列的成员还可以是序列,这样可以构成多层的序列。比如 [[1,2,3],[2,3,1],[3,1,2]] 就是个合法的序列,其每个成员又是一个序列。

我们来看多层序列的成员如何引用:


A

1

=[[1,2,3],[4,5,6],[7,8,9,10]]

2

=A1(2)

3

=A1(3)(2)

4

>A1(1)(3)=0

5

=A1.len()

6

=A1(3).len()

7

>A1(2)=0

尝试执行上面的代码,观察运行结果来理解多层序列的成员引用和赋值的动作。

A2 的结果是序列 [4,5,6];A3 取出第 3 个成员序列的第 2 成员,即 8;A4 执行后将使第 1 个成员序列的第 3 个成员变成 0,原来是 3;A5 是序列长度为 3,A6 是第 3 个成员序列的长度,为 4;A7 执行后会将第 2 个成员序列变成 0,这个成员就不再是序列了。

在界面上也可以显示多层序列,上述代码执行完之后,点中 A1 可以在右边看到其值。

imagepng

其序列成员也将显示成序列,这时候双击某个序列成员(比如箭头指向的第 3 个成员),将会再显示这个成员序列的成员:

imagepng

由 n 个长度为 m 的序列构成的序列可以理解成一种二维结构,将每个成员序列写成一行,可以看成是个 n 行 m 列的表格。因此,有些程序语言也把两层的序列称为二维数组,甚至做了特殊处理,可以支持形如 x(i,j) 的写法用于访问第 i 行第 j 列的成员。在 SPL 中没有特殊理解,就是简单理解成第 i 个成员序列的第 j 个成员,即写成 x(i)(j) 的样子。

显然,这些层级还可以更多,对应到数组的术语也就是维度还可以更多。

我们用二层序列来计算帕斯卡三角形(我国称为杨辉三角):

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

……

帕斯卡三角是由 n 行数字构成,第 n 行有 n 个数,第 n 行的第 m 个数是由第 n-1 行的第 m-1 个和第 m 个数相加而成。帕斯卡三角的第 n 行数,恰好是 (1+x)n中 xi项的系数,即:

imagepng

代码很简单:


A

B

C

D

1

5

=[0]*(A1+1)

>B1(1)=[1]

>B1(2)=[1,1]

2

for   3,A1+1

>B1(A2)=[1]*A2



3


for   2,A2-1

>B1(A2)(B3)=B1(A2-1)(B3-1)+B1(A2-1)(B3)

计算到第 A1+1 行,结果是个二级序列,存在 B1 中。

B1 产生长为 A1+1 的序列准备填入,C1、D1 先填入前两行。A2 的循环从第 3 行起计算,B2 产生一个长度为 A2 的全 1 序列用于当前行,然后从第 2 列计算到第 A2-1 列,因为这一行的第 1 列和第 A2 列都是 1,不必计算了。

【程序设计】 前言及目录
【程序设计】4.2 [排成队] 序列循环
【程序设计】4.4 [排成队] 理解对象