最初〜1.6まで
授業の合間とか暇な時間に読んではいるのだけど、読んでるだけでは今ひとつなので気が向いたときに写経しつつ問題を解くことにする。
問題1.2
;; 5 + 4 + (2 - (3 - (6 + 4/5))) ;; ----------------------------- を前置記法に翻訳せよ。 ;; 3(6-2)(2-7) (display (/ (+ 5 4 (- 2 (- 3 (+ 6 (/ 4 5))))) (* 3 (- 6 2) (- 2 7))))
puts ((5.0 + 4.0 + (2.0 - (3.0 - (6.0 + 4.0/5.0)))) / (3.0 * (6.0 - 2.0) * (2.0 - 7.0)))
問題1.3
;; 三つの数を引数として取り、大きい二つの数の二乗の和を返す手続きを定義せよ (define (sum-of-square-of-big-two x y z) (define (square n) (* n n)) (define (sum-of-square a b) (+ (square a) (square b))) (cond ((and (< x y) (< x z)) (sum-of-square y z)) ((and (< y z) (< y x)) (sum-of-square z x)) ((and (< z x) (< z y)) (sum-of-square x y))))
module Calc def square (x) x = x.to_i x * x end def sum_of_square (x, y) square(x) + square(y) end private :square, :sum_of_square def sum_of_square_of_big_two(x, y, z) if ((x < y) and (x < z)) then return sum_of_square(y, z) end if ((y < z) and (y < x)) then return sum_of_square(z ,x) end if ((z < x) and (z < y)) then return sum_of_square(x ,y) end end end if $0 == __FILE__ include Calc sum_of_square_of_big_two 1, 2, 3 #=> 13 sum_of_square_of_big_two 5, 2, 3 #=> 34 end
ただ今1.7を考え中。
読むほうは2章まで到達したのだけど数学の素養のない自分には2章の内容の方が理解しやすくて面白そうだ。
SICPを巨大な問題集と考えて問題をrubyとかの別の言語でやってみるのも良いかも。
追記
ということでrubyでやってみた。schemeに比べるとやや冗長な感じ。まぁまだ簡単なところだから対して差は感じなかった。