プログラミングについて勉強する(2)

「コンピュータプログラミングの概念・技法・モデル」の続き
やばい,早速日があいてしまった.

第1章の練習問題をやってみたけど,Oz でどう書くのかがわからず,結構困ってしまった.
まだ全部やってないけど,先に進もう.

1.(a)

なんだろう?
S_n = \frac{ar(1-r^n)}{(1-r)}
じゃなさそうだし.

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 個目の数値は,
  _{k-1}C_m + _{k-1}C_{m-1} であるため,
  _kC_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)が得られる.