プログラミングについて勉強する(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)が得られる.