名前のついた入れ物と思える. 変数が式の中に現れるとその中に入って いる値と置き換わる. また, 代入式の左辺に現れると, 右辺の値が その入れ物の中身になる (上書き).
入れ物が長さ Size 個だけつながったもの.
A[0] | A[1] | ![]() |
A[Size-1] |
[0] A = newvect(5); /* 長さ 5 の配列 (vector) を生成して A に代入 */ [ 0 0 0 0 0 ] /* 最初は 0 ベクトル */ [1] B = newvect(3,[1,2,3]); /* 長さ 3 の配列を初期値指定して生成 */ [ 1 2 3 ] /* B[0] = 1, B[1] = 2, B[2] = 3 */
[3] B[2]; /* B の添字 2 に対応する要素 */ 3 [4] C = (B[0]+B[1]+B[2])/3; /* 式の中に現れる配列要素アクセス */ 2 [5] C; /* C には 2 が入っている */ 2
[6] A[0] = -1; /* A の先頭に -1 を代入 */ -1 [7] A; /* A が配列なら, A の値は配列全体 */ [ -1 0 0 0 0 ]
[8] size(A); /* 長さを取り出す組み込み関数 */ [5] /* リストを返す */ [9] size(A)[0]; /* リストの先頭要素が長さ */ 5
配列についてまとめると,次のようになる.
def max(A) { /* A は配列を入力 */ N = size(A)[0]; /* N = A の長さ */ Max = A[0]; /* とりあえず,先頭要素を最大値とする */ for (I = 1; I < N; I++ ) if ( A[I] > Max ) Max = A[I]; /* Max = max(A[0],...,A[I] */ return Max; }for 文における添字の範囲に注意する. 1 から N までだから といって, for ( I = 1; I <= N-1; I++ ) とせず, for (I = 1; I < N; I++ ) とするのがスマートな書き方 である.
ここで定義した関数を呼び出す場合, 入力として適当な長さの配列 を用意する必要がある.
[10] A = newvect(7,[2,3,5,10,-1,8,7]); /* 初期化して生成 */ [ 2 3 5 10 -1 8 7 ] [11] max(A); 10
def a(N) { A = newvect(N+1); /* 全部で N+1 項分必要 */ A[0] = 1; /* a_0 = 1 */ for ( I = 1; I <= N; I++) A[I] = 3*A[I-1] + 2; /* 漸化式そのまま */ return A; /* 配列全体を値として返す */ } [1] a(10); [1 5 17 53 ... ]
考えられる方法を列挙すると
sorting 方法にはいろいろあって, そのうちまとめて話すことになると思うが, とりあえず簡単に思い付く方法はあると思う.
完全に大きさの順に並べる必要はない.
一番小さいもの, を求められているときに, 大きい順に並べるのは効率悪すぎ.