読者です 読者をやめる 読者になる 読者になる

最初〜1.6まで

SICP scheme ruby

授業の合間とか暇な時間に読んではいるのだけど、読んでるだけでは今ひとつなので気が向いたときに写経しつつ問題を解くことにする。

問題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に比べるとやや冗長な感じ。まぁまだ簡単なところだから対して差は感じなかった。