SICPゼミ第23回

練習問題3.38

a.
35 Peter->Mary->Paul
40 Mary->Peter->Paul (後ろ二人順不同)
45 Peter->Paul->Mary (前二人順不同)
50 Paul->Mary->Peter

b.
60
f:id:sicp-zemi:20160829162710j:plain

by tube

練習問題3.39

100, 101, 121.

by tube

練習問題3.40

10^k (k = 2,3,4,5,6)

直列化すると10^6だけ

by dolicas

練習問題3.41

'balance はset!しないので変なことはおきない。

by dolicas

練習問題3.42

問題ない。

練習問題3.43

直列化されているので口座1と口座2の交換中に、これら2つの口座に他の処理が行われることはない。よってこの1回交換によって残高が交換される(さらに合計は保存する)ことが示されれば、帰納的に全体でもそのようになると分かる。1回の交換で大丈夫なのは自明。

serializeしなかったとき。
口座1と口座2、口座2と口座3をexchange
合計も破綻してる。
f:id:sicp-zemi:20160829173912j:plain

by dolicas

練習問題3.44

Louis は正しくない。
exchange のときは balance にアクセスして得た値を直列化せずに使用していたため問題が発生したが、transfer では、withdraw, deposit それぞれ自体は直列化されているため問題が発生しない。

by tube

練習問題3.45
((serializer1 (serializer2 exchange ))
	account1
	account2 )))

のところで、serializer1が使われる。
その後 (exchange acount1 acount2)が処理されるが、この中で ((account1 'withdraw) difference) が実行される。これは (balance-serializer withdraw) で、serializer1(balance-serializerと同じ)で直列化されているが、

((serializer1 (serializer2 exchange ))
	account1
	account2 )))

ですでにserializer1を使ってしまっているのでこの部分は実行されず待機される。この待機が解消されることはなく永遠に処理が終わらない。

by dolicas