プログラミングについて勉強する(2)
「コンピュータプログラミングの概念・技法・モデル」の続き
やばい,早速日があいてしまった.
第1章の練習問題をやってみたけど,Oz でどう書くのかがわからず,結構困ってしまった.
まだ全部やってないけど,先に進もう.
1.(a)
なんだろう?
じゃなさそうだし.
declare
X = {NewCell 1}
for I in 1..100 do X := @X * 2 endか
declare
fun {Pow B P}
if P==1 then B else B*{Pow B P-1} end
end
{Browse {Pow 2 100}}のどちらかなのかな?
1.(b)
declare
X = {NewCell 1}
for I in 2..100 do X := @X * I end
{Browse @X}これでいいのかな?
2.(a)
declare
fun {Fact N}
if N==0 then 1 else N*{Fact N-1} end
end
fun {Perm N M}
if M==0 then 1 else N*{Perm N-1 M-1} end
end
fun {Comb N K}
{Perm N K} div {Fact K}
end
2.(b)
fun {Comb N K} T in
if K > (N div 2) then T=N-K else T=K end
{Perm N T} div {Fact T}
end
3.
{Pascal N} を P(N) とする.
N = 1:
P(1) = [1]
N = k:
P(k-1) を正しいと仮定する.
P(k) の計算において,m 個目の数値は,
であるため,
ゆえに正しい.
4.
1.7節は,どうともいっていない.
指数関数時間のプログラムよりは実用的かと.
5.
無限リストの和を求めようとするため,戻ってこなくなる.
有限リストに対しては有効.
6.(a)
Shift に 0 を使っているから.
Mul1 を使うと,一番外側は1,2,3,...と増え,内側の数値は爆発的に大きくなる.
6.(b)
↓こういう風にかけない.書き方間違えてるのかな?
fun {TestPascal Op}
for I in 1..10 do
{Browse {GenericPascal Op I}}
end
end
{TestPascal Add}
7.
X = 44 の X はスコープを外れるから,はじめの X = 23 が表示される.
X := 44 はメモリセルに入れてるから,そのまま 44 が表示される.
8.
呼び出す度に NewCell してる.
修正例:
declare
local Acc in
Acc={NewCell 0}
fun {Accumulate N}
Acc:=@Acc+N
@Acc
end
end
9.
なんだ?補充ファイルって?
10.(a)
1番目の thread の I = @C を実行した直後,
スイッチして2番目の thread が起動して C := J+1 まで終えたとする.
1番目の thread に戻って残りが実行されると,@C が 1 となる.
(てか,答え書いてあるな,これ)
10.(b)
declare
C = {NewCell 0}
thread I in
I = @C
{Delay 100} % 適当に
C := I+1
end
thread J in
J = @C
C := J+1
end
10.(c)
(「1.6節に...」とあるが,おそらく1.16節の間違い)
正しく Lock オブジェクトを取得すれば,たとえ Delay をかけても正しい結果(この場合は2)が得られる.