1 ベクトル

計算機数学演習 A 2015.5.11. Risa/Asir のプログラミング (ベクトル, リスト)
前回 : Asir における if 文. Asir における関数の定義, 呼び出し.
1. 階乗を計算する関数 fact.txt
def fact(N)
{
S = 1;
for (I = 1; I <= N; I++) {
S = S * I;
}
return S;
}
end;
2. 階乗を計算する関数 fact の呼出 (Asir)
(プログラム fact.txt を読み込み)
[8] fact(5);
120
[10] fact(20);
2432902008176640000
ベクトル
1
Asir でのベクトルは, C 言語での配列に相当するデータ型である. 関数 newvect(データサイズ) で, 引数で指定され
たデータの数を持つベクトルを生成する. C 言語の配列の場合と同様に, 変数名 [番号] のように添字を指定することで,
そこのデータにアクセスできる. C 言語の配列と同様に, 添字は 0 から始まり, (データサイズ) − 1 までである. ベクト
ルの各成分にはどのようなデータを入れてもよい.
A = newvect(5);
A[0]
A[1]
A[2]
A[3]
A[4]
0
0
0
0
0
サイズ 5 のベクトルを生成.
3. ベクトルの生成, ベクトルの各要素への参照, 代入
[1854] A=newvect(5); <-- サイズ 5 のベクトルを生成し, それを変数 A に代入
[ 0 0 0 0 0 ]
[1855] A[0]=1;
<-- ベクトルの第 0 成分に 1 を代入
1
[1856] A[1]=2;
<-- ベクトルの第 1 成分に 2 を代入
2
[1857] A[2]=3;
3
[1858] A[3]=4;
4
[1859] A[4]=5;
5
[1860] A;
<-- ベクトル A の表示
[ 1 2 3 4 5 ]
[1861] length(A);
<-- ベクトル A の長さ
5
[1862] A[3] = (x+1)^3; <-- 数だけでなく, 何でも代入できる
x^3+3*x^2+3*x+1
[1863] A;
[ 1 2 3 x^3+3*x^2+3*x+1 5 ]
[1864] A[2];
<-- A[2] でベクトル A の第 2 成分を取り出す
3
例 1. 数列 an = n3 (n = 1, 2, 3, . . .) を考える. この数列の第 1 項から第 100 項までをベクトルに入れて, その値を表示
するプログラムは次のようになる.
4. 数列の表示 (seq.txt)
A = newvect(101);
for (I = 1; I <= 100; I++) {
A[I] = I^3;
}
print(A);
end;
さらに, 関数を使って数列を計算するように変更する. 関数名は cseq で, 関数の引数 N で第 N 項まで計算と指定する.
1
5. 数列を計算する関数 (cseq.txt)
6. 数列を計算する関数 cseq の呼び出し (Asir)
def cseq(N)
{
A = newvect(N + 1);
for (I = 1; I <= N; I++) {
A[I] = I^3;
}
return A;
}
end;
(5. のプログラムを
[31] cseq(10);
[ 0 1 8 27 64 125
[33] B=cseq(20);
[ 0 1 8 27 64 125
[34] B;
[ 0 1 8 27 64 125
[35] B[10];
1000
[36] B[11];
1331
Asir で読み込んだ後)
<--
関数 cseq(10) を呼出. 数列 a_n=n^3 を第 10 項まで計算
216 343 512 729 1000 ]
<-- 関数 cseq(20) を呼出し, その返り値であるベクトルを B に代入.
216 343 512 729 1000 1331 1728 2197 2744 3375 4096 4913 5832 6859 8000 ]
216 343 512 729 1000 1331 1728 2197 2744 3375 4096 4913 5832 6859 8000 ]
<-- ベクトル B の第 10 番目を表示. これは a_10 = 10^3.
<-- ベクトル B の第 11 番目を表示. これは a_11 = 11^3.
問題 2. 初項 F=100, 公比 R=2/3 が与えられているとする. この時, 等比数列 an の第 1 項から第 100 項までを計算し,
各項をベクトルに代入, 表示するプログラムをつくれ. (4. がヒント)
7. 等比数列の表示 (gseq.txt)
F=100;
R=2/3;
end;
さらに, 関数を使って等比数列を計算するように変更する. 関数名は gseq で, 関数の引数 F は初項, R は公比, N で第 N
項までの計算すると指定することにする. (5. がヒント)
8. 等比数列を計算する関数 (gseq2.txt)
def gseq(
{
)
}
end;
例 3. 漸化式 an+1 = 3an + 2 (n ≥ 1), a1 = 1 で定義される数列 an (n = 1, 2, 3, . . .) を考える. この数列の第 1 項から
第 100 項までをベクトルに入れて, その値を表示するプログラムは次のようになる.
9. 漸化式で定義される数列の表示 (rec.txt)
A = newvect(101);
A[1] = 1;
for (I = 2; I <= 100; I++) {
A[I] = 3*A[I - 1] + 2;
}
print(A);
end;
問題 4. 漸化式 an+1 = 3an + 2 (n ≥ 1), a1 = 1 で定義される数列 an (n = 1, 2, 3, . . .) の第 1 項から第 N 項までをベ
クトルに入れて, その値を表示する関数 rec を書け. ここで N は関数 rec の引数である.
問題 5. フィボナッチ数列とは, 漸化式 Fn+2 = Fn+1 + Fn (n ≥ 1), F1 = 1, F2 = 1 で定義される数列であった. フィボ
ナッチ数列 Fn の第 1 項から第 N 項までをベクトルに入れて, その値を表示する関数 fib を書け. ここで N は関数 fib
の引数である.
2