This article was migrated from http://rai
今回は404 Blog Not Foundでお馴染みの小飼さんのご自宅で開催されました。
非常に素晴らしい環境を利用させていただいことに感謝いたします。
参加者は、だいたい前回と同じくらいで23名。
最近各所で遭遇するようになってきた面々や、CNetブロガーの山下さん、そしてもちろん小飼さんも参加されていました。
今回も前回同様、演習問題を黙々と解いていくという形式で進められました。
実際に解いた演習問題は1.32と1.33です。
何問か問題を解いてみて、ようやく括弧が見えなくなる感覚が芽生えてきました。
演習問題1.33については、過去の演習問題で作成した関数 'prime?' を利用する必要がある(しなくても良いけれど、時間が掛かりそうな)ため、Wikiからコピーしてきました。
filtered-a
(define (filtered-a
(if (> a b)
null-value
(combiner (if (filter a) (term a) null-value
(filtered-a
combiner が受け取るのは a ではなく (term a) なので、term が全単射でないかぎり、逆写像が存在しないので、元の a の値が何だったのかわからず、combiner の定義の仕方だけでは filter と同等のものを構成できない場合もあるかなー、と思います。
どうでしょう。
というわけで、とても楽しい時間がすごせました。
帰り際に小飼さんの奥様からコーヒーを振舞って頂きました。
ありがとうございます。
小飼さん自身からも、壁面を覆う巨大な書架(うらやましい!)よりお勧めの本を何冊か紹介していただきました。ロジャー・ペンローズ氏の著書は読んだことが無かったですが、機会があったらぜひ読んでみたいですね。恥ずかしながらペンローズ・タイリングのペンローズ氏が同氏と同一人物であると初めて知りました。もっと昔の別なペンローズさんかとばかり思っていました。
ということで、次週は演習1.34から開始。各自写経をすませておくべしとの事。
最後に、今回使ったコードを置いておきます。 ----
;; -*- Mode: scheme; indent-tab
;; 1.2.6 素数性のテスト
(define (square x) *1)
(define (smallest-d
(find-divis
(define (divides? a b)
(= (remainder b a) 0))
(define (find-divis
(cond ((> (square test-divis
((divides? test-divis
(else (find-divis
(define (prime? n)
(if (< n 2)
#f
(= n (smallest-d
;; Fermatの小定理
;(begin ; for gauche
; (define (square x) *2)
; (use srfi-27)
; (define random random-int
(define (expmod a n m)
(cond ((= n 0) 1)
((even? n)
(remainder (square (expmod a (/ n 2) m)) m))
(else
(remainder *3 m)) m))))
(define (fermat-tes
(define (try-it a)
(= (expmod a n n) a))
(try-it (+ 1 (random (- n 1)))))
(define (fast-prime
(cond ((= times 0) #t)
((fermat-tes
(else #f)))
;; 問題 1.22
;; gauche用runtime (microsecを返す)
(define (runtime)
(use srfi-11)
(let-values
(+ *4 b)))
(define (timed-prim
(newline)
(display n)
(start-prim
(define (start-prim
(if (prime? n)
(report-pri
(define (report-pri
(display " *** ")
(display elapsed-ti
(define (search-for
(let loop ((i beg))
(cond ((> i end) #f)
(else
(if (odd? i) (timed-prim
(loop (+ i 1))))))
;
; ここから下が僕の書いたコード
(define (cube x) *5)
(define (sum-intege
(if (> a b)
0
(+ a (sum-intege
(define (sum-cubes a b)
(if (> a b)
0
(+ (cube a) (sum-cubes (+ a 1) b))))
(define (pi-sum a b)
(if (> a b)
0
(+ (/ 1.0 *6)) (pi-sum (+ a 4) b))))
(define (sum term a next b)
(if (> a b)
0
(+ (term a)
(sum term (next a) next b))))
(define (identity x) x)
(define (inc x) (+ x 1))
(define (integral f a b dx)
(define (add-dx x) (+ x dx))
*7) add-dx b)
dx))
(define (even n)
(= (remainder n 2) 0))
(define (integral_s
(define h (/ (- b a) n))
(define (y k)
(define c (if (or (= k 0) (= k n))
1
(if (even k) 2 4)))
*8))))
*9
(/ h 3.0)))
(define (sum_i term a next b)
(define (iter a result)
(if (> a b)
result
(iter (next a) (+ result (term a)))))
(iter a 0))
(define (integral_i
(define (add-dx x) (+ x dx))
*10) add-dx b)
dx))
(define (product factor a next b)
(if (> a b)
1
*11
(product factor (next a) next b))))
(define (product_i factor a next b)
(define (iter a result)
(if (> a b)
result
(iter (next a) *12))))
(iter a 1))
(define (factorial n)
(product identity 1 inc n))
(define (sq x) *13)
(define (approx_pi n)
(define (y k) (/ (sq (+ k 4)) (sq (+ k 3))))
(define (next x) (+ x 2))
*14) (product_i y 0 next n)))
; ここから下が今回書いたコード
;
(define (accumulate
(if (> a b)
null-value
(combiner (term a)
(accumulate
(define (accumulate
(define (iter a result)
(if (> a b)
result
(iter (next a) (combiner result (term a)))))
(iter a null-value
(define (filtered-a
(if (> a b)
null-value
(combiner (if (filter a) (term a) null-value
(filtered-a
(define (e_1_33_a n)
(filtered-a
(define (e_1_33_b n)
(define (relatively
(= (GCD i n) 1))
(filtered-a
This article was migrated from http://rai
posted by
genki
on Thu 11 May 2006
at 02:52