理系学生日記

おまえはいつまで学生気分なのか

SICP

問題2-47 (2.2.4 Example: A Picture Language)

まず (define (make-frame origin edge1 edge2) (list origin edge1 edge2)) に対する選択子がこれ。 (define (get-origin frame) (car frame)) (define (get-edge1 frame) (cadr frame)) (define (get-edge2 frame) (caddr frame)) 次に (define (make-fram…

問題2-46

どっかでやった問題ですね。 (define (make-vect x y) (cons x y)) (define (x-cor vect) (car vect)) (define (y-cor vect) (cdr vect)) (define (add-vect v1 v2) (make-vect (+ (x-cor v1) (x-cor v2)) (+ (y-cor v1) (y-cor v2)))) (define (sub-vect v1…

問題2-45 (2.2.4 Example: A Picture Language)

関数を引数にとる関数を返す関数を作るのでがんばる。 (define (split first second) (define (make-split painter n) (if (= n 0) painter (let ((smaller (make-split painter (- n 1)))) (first painter (second smaller smaller))))) make-split) これに…

問題2-43 (2.2.4 Example: A Picture Language)

ようやく図形言語にはいったんですけど、また図は書けないので残念です。 そういうわけでこのプログラムも動かせない。 (define (up-split painter n) (if (= n 0) painter (let ((smaller (up-split painter (- n 1)))) (below painter (beside smaller sma…

問題2-43 (2.2.3 Sequences as Conventional Interfaces)

Louis Reasonerがまたミスをして、昨日のn-queen問題のflatmap以下をこんな風にして書きやがったらしい。 (flatmap (lambda (new-row) (map (lambda (rest-of-queens) (adjoin-position new-row k rest-of-queens)) (queen-cols (- k 1)))) (enumerate-inter…

問題2-42 (2.2.3 Sequences as Conventional Interfaces)

かの有名なn-queen問題をschemeで解くよ!! mNC[âè(N Queens Problem) 昔prologで8-queen問題解くプログラム書くのにクソ時間かかった気がするんですけど、今回も結構かかった。 SICPは優しいので、こんなスケルトンを用意してくれています。 (define (queens…

問題2-41 (2.2.3 Sequences as Conventional Interfaces)

今日は、足してsになるような3つ組をもとめる。 orderedでdistinctって指定なんで、3つ組(i, j, k)はk ; 昨日の (define (enumerate-interval low high) (if (> low high) () (cons low (enumerate-interval (+ low 1) high)))) ; 昨日の (define (unique-pa…

問題2-39 (2.2.3 Sequences as Conventional Interfaces)

[tex:1\leq j (define (square x) (* x x)) (define (smallest-divisor n) (find-divisor n 2)) (define (find-divisor n test-divisor) (cond ((> (square test-divisor) n) n) ((divides? test-divisor n) test-divisor) (else (find-divisor n (+ test-di…

問題2-39

fold-left、fold-rightを使ってreverseを作るよ。 (define (fold-right op initial sequence) (if (null? sequence) initial (op (car sequence) (fold-right op initial (cdr sequence))))) (define (fold-left op initial sequence) (define (iter result …

問題2-38

今まで、accumulate大人気だったんですけど、強制的に改名されてしまった。 名前をfold-rightとかいう。 野口英世もそうですし、豊臣秀吉もそうで、accumulateも名前を変えてたぶんだけど出世するんです! ここで、モンキッキーとかハッピーハッピー。も名前…

問題2-37 (2.2.3 Sequences as Conventional Interfaces)

schemeで行列計算する!!わくわくしてきた!! まずデータをどう表現するかが問題なんですけど、そこはSICPですから、ちゃんと教えてくれてます。偉い! はこう書くよ。 (list (list 1 2 3 4) (list 4 5 6 6) (list 6 7 8 9) したら、ベクトル同士の内積はこう書…

問題2-36

なんかスゲー書きにくい問題。 リストのリストを引数として取って、そのリストのリストの添え字のおなじ各要素に対して演算した後、その結果をリストにして返すよ。 こうやったらできるよ! (define (accumulate-n op init seqs) (if (null? (car seqs)) () …

問題2-35

木構造の葉の数を数えるcount-leavesってのが前にあったんですけど、それをaccumulate使って書き直せだって。 accumulateの人気に嫉妬。 accumulateは超人気者です。抽象度が高いと人気者になれる。 (define (accumulate op initial sequence) (if (null? se…

問題2-34(2.2.3 Sequences as Conventional Interfaces)

という形の多項式をという形に直して計算する方法をHornerの方法とか言います。 こうやると計算回数が若干程度おさえられる。スバらしい!! これをschemeで書くのが課題です。 accumulate使えば良いみたい。 (define (accumulate op initial sequence) (if (n…

問題2-33 (2.2.3 Sequences as Conventional Interfaces)

この小節(2.2.3)では、モジュールの構成法、可読性のためにとても大事なことを言っていて、いわく信号処理のように、独立したブロックとして考えなさいって言っている。 プログラムを組むときには当たり前の話ですけど、副作用のない関数型言語であれば、か…

問題2-32

集合のべき集合を求めます。 (define (map proc items) (if (null? items) () (cons (proc (car items)) (map proc (cdr items))))) (define (subsets s) (if (null? s) (list ()) (let ((rest (subsets (cdr s)))) (append rest (map (lambda (x) (cons (ca…

問題2-31

昨日とおなじなんだけど、もっと抽象度をあげる。 関数を引数にするよ!! よく見ると昨日のとほとんどかわってない。 (define (map proc items) (if (null? items) () (cons (proc (car items)) (map proc (cdr items))))) (define (tree-map proc tree) (map…

問題2-30

木構造の葉の部分は単なる整数なんですけど、そういう木の葉っぱの部分を2乗する関数を書けとかそういう。 単純なのはこっちです。あんまし抽象な感じでもない。 (define (square x) (* x x)) (define (square-tree tree) (cond ((null? tree) ()) ((not (pa…

問題2-29

a (define (make-mobile left right) (cons left right)) (define (make-branch length structure) (cons length structure)) (define (left-branch mobile) (car mobile)) (define (right-branch mobile) (car (cdr mobile))) (define (branch-length branc…

問題2-28

木構造の根のみからなるリストを返せって問題。 appendが問題2-27で出てきていたので、使ってみた。 (define (fringe x) (define (fringe-make-list elem) (cond ((null? elem) ()) ((list? elem) (append (fringe-make-list (car elem)) (fringe-make-list …

問題2-26

こんなん定義してから、解釈系の印字結果示せみたいな問題なんですけど、この差はわりかし楽しいですね。 (define x (list 1 2 3)) (define y (list 4 5 6)) 楽しい。 gosh> (append x y) (1 2 3 4 5 6) gosh> (cons x y) ((1 2 3) 4 5 6) gosh> (list x y) …

問題2-25

7ばっかり取り出しますね! gosh> (car (cdr (car (cdr (cdr (list 1 3 (list 5 7) 9)))))) 7 gosh> (car (car (list (list 7)))) 7 たぶんこのコードが右に突き抜けて表示されるんだけど、無視する。 gosh> (car (cdr (car (cdr (car (cdr (car (cdr (car (…

問題2-24

ようやく木構造にはいる。 印字結果。 gosh> (list 1 (list 2 (list 3 4))) (1 (2 (3 4))) 対応する箱とポインタ構造 (1 (2 (3 4)))->|o|o| | | |1|o| | |2|o| | |3|4| 木としての解釈。 (1 (2 (3 4))) | | 1 (2 (3 4)) | | 2 (3 4) | | 3 4

問題2-23

for-eachを実装しろって話なんですけど、なんか結構むずかしかった。 難しかったのは、リストが空リストでないとき 関数をリストの先頭要素に作用させる リストの残りの要素に対して再帰的にfor-eachを呼び出す てのを同時に行わないといけないところ。2つの…

問題2-22

Louis Reasnorがこんなの作って、逆順に出力されたとか何とか騒いでいるらしい。 (define (square x) (* x x)) (define (square-list items) (define (iter things answer) (if (null? things) answer (iter (cdr things) (cons (square (car things)) answe…

問題2-21

リストの要素を2乗したリストかえす。 あんまし抽象度高くないやつ。 (define (square-list items) (if (null? items) () (cons ((lambda (x) (* x x)) (car items)) (square-list (cdr items))))) 抽象度ちょっと高いやつ。 (define (map proc items) (if (…

問題2-20

(define (reverse l) (define (sub-reverse list stack) (if (null? list) stack (sub-reverse (cdr list) (cons (car list) stack)))) (sub-reverse l ())) (define (same-parity head . li) (define l (reverse li)) (define (sub-same-parity residual li…

問題2-19

こんなのが与えられてて、たとえば10円の出し方が何通りあるかを計算できる。 (define (cc amount coin-values) (cond ((= amount 0) 1) ((or (< amount 0) (no-more? coin-values)) 0) (else (+ (cc amount (except-first-denomination coin-values)) (cc (…

問題2-18

逆順リストを作成する。これも学部の頃standard MLの課題であったような。 (define (reverse l) (define (sub-reverse list stack) (if (null? list) stack (sub-reverse (cdr list) (cons (car list) stack)))) (sub-reverse l ())) てすてす。 gosh> (reve…

問題2-17

リストの最後の要素だけからなるリストを返せ! (define (last-pair list) (cond ((null? list) ()) ((null? (cdr list)) list) (else (last-pair (cdr list))))) 最初の条件は、空リストが与えられたとき用で、こんな感じになる。 gosh> (last-pair (list 33…