[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends:00287] 「計算機プログラムの構造と解釈第2版」読書会第3 回議事録



―――――――――――――――――――――――――――――――――――
インパク「人類博物館−500万年進化の旅−」 =>=> http://www.jinrui.net 
―――――――――――――――――――――――――――――――――――
「インターネット博覧会(インパク)」の埼玉パビリオンがオープン!
今話題の【AIBO】や【エアボード】が当たる!今すぐアクセス!
------------------------------------------------------------------------


えんどうです。

阿部さんから第3回読書会の議事録をいただいたので代理投稿します。

================

「計算機プログラムの構造と解釈 第2版」 読書会 第3回 議事録

日時:2000/09/01 (土) 13:00から17:00まで
場所:横浜市立野毛地区センター(ちぇるる3F)工芸室
参加者:金山さん 横山さん 高橋さん 伊部さん えんどうさん 
	寺元さん 阿部(書記) yamashitaさん 小室さん
読み手: えんどうさん
当日のスケジュール:
	自己紹介を兼ねた歓談(夏休みの話等)
	前半
	休憩
	後半
	宴会

全般的にえんどうさんが読んで、yamashitaさんが解説をするという形で進行
しました。尚、本記録中にあるプログラムは、yamashitaさんが板書した際に
省略した部分を一部補った上で実際の処理系(SCM)で動作確認してあります。

1.3 高階関数
1.31 引数としての手続き

問題1.30 (総和関数sum の反復版)
yamashitaさんによる解答例

(define (sum term a next b)
  (define (iter a result)
    (if (> a b)
	result
	(iter (next a) (+ result (term a)))))
  (iter a 0))

問題1.32
yamashitaさんによる解答例
a.(再帰版)
(define (accum comb nv term a next b)
  (define (rec a b)
    (if (> a b)
	nv 
	(comb a
	      (rec (next a) b))))
  (rec a b)
)

;; accnumを使ったsumの定義
(define (sum term a next b)
  (accum + 0 term a next b))

;; accnumを使ったproductの定義
(define (product term a next b)
  (accum * 1 term a next b))

b.(反復版)
(define (accum comb nv term a next b)
  (define (iter a result)
    (if (> a b)
	result
	(iter (next a) 
	      (comb result (term a))))) 
  (iter a nv))

問題 1.33
yamashitaさんによる解答例
(define (fac con filter nv ...)
  (if (> a b)
      nv
      (if (filter n)

)

1.32 lambdaを使う手続きの構築

局所変数を作り出すletの使い方

えんどうさん>P.36のletの一般形の定義は、誤植でかっこが一組足りない。
正しくは

(let ((<var1> <exp1>)
      (<var2> <exp2>)
	…
      (<varn> <expn>))
  <body>)
<PRE>=1B$B!=3D!=3D!=3D!=3D!=3D!=3D!=3D!=3D!=3D!=3D!=3D!=3D!=3D!=3D!=3D!=3D!=
=3D!=3D!=3D!=3D!=3D!=3D!=3D!=3D!=3D!=3D!=3D!=3D!=3D!=3D!=3D!=3D!=3D!=3D!=3D=
=1B(B<BR>= A=1B$B%$%s%Q%/!V?MN`GnJ*4[!]=1B(B500=1B$BK|G/?J2=3D$NN9!]!W=1B(B=
=20=3D>=3D>=20http://www.jinrui.net=20<BR>= A=1B$B!=3D!=3D!=3D!=3D!=3D!=3D!=
=3D!=3D!=3D!=3D!=3D!=3D!=3D!=3D!=3D!=3D!=3D!=3D!=3D!=3D!=3D!=3D!=3D!=3D!=3D=
!=3D!=3D!=3D!=3D!=3D!=3D!=3D!=3D!=3D!=3D=1B(B<BR>= A=1B$B!V%$%s%?!<%M%C%HGn=
Mw2q!J%$%s%Q%/!K!W$N:k6L%Q%S%j%*%s$,%*!<%W%s!*=1B(B<BR>= A=1B$B:#OCBj$N!Z=
=1B(BAIBO=1B$B![$d!Z%(%"%\!<%I![$,Ev$?$k!*:#$9$0%"%/%;%9!*=1B(B<BR>= A-----=
-------------------------------------------------------------------<BR>= A<=
BR>= A</PRE>



区間二分法による方程式の零点の探索
えんどうさん>二分法は区間によって集束しない場合がある。

抽象と第一級手続き

問題1.41
yamashitaさんによる説明

与式を実際に、置換法(substitution model)で展開してみるとincが16回
(2^2^2回)呼び出されていることがわかる。

;; incの定義
(define inc (lambda (n) (+ n 1)))
=>#<unspecified>
;; doubleを定義する
(define double (lambda (f) 
		 (lambda (x) 
		   (f (f x)))))
=>#<unspecified>

;; テスト
((double inc) 5)
=>7

;; 問題
(((double (double double)) inc) 5)
=>21

(((double (double double)) inc) 5)
=
(((double (double double)) 
  (lambda (x) (+ x 1))) 5)
=
(((double
   ((lambda (f) (lambda (x) (f (f x)))) 
    (lambda (f) (lambda (x) (f (f x))))))
  (lambda (n) (+ n 1))) 5)
=
(((double
   (lambda (x) 
     ((lambda (f) (lambda (x) (f (f x)))) 
      ((lambda (f) (lambda (x) (f (f x)))) x)))) 
  (lambda (n) (+ n 1))) 5)
=
(以下略)
				  
最後にyamashitaさんから、次回で扱うリスト処理の概略的な説明(ボックス
記法によるリストの表現、cons等)がありました。

次回(第4回)は第2章 「データによる抽象の構築」から。

以上
---
阿部 智彦(byj02057@xxxxxxxxx)