iriya_ufo’s blog

Curiosity was simply the first derivative of knowledge.

SICP

大体2年前くらいの話だ.

SICPの問題の解を先輩に聞いたことがあった.

11ページの問題1.3で以下のような問題だった.

三つの数を引数としてとり,大きい二つの数の二乗の和を返す手続きを定義せよ.

僕が書いた解答はこんな感じだった.

(define (sum-of-squares-of-biggers x y z)
  (if (> x y) 
      (sum-of-squares x (if (> y z) y z))
      (sum-of-squares y (if (> x z) x z))))

(define (sum-of-squares x y)
  (+ (square x) (square y)))

(define (square x) (* x x))

(display (sum-of-squares-of-biggers 1 2 3))
(newline)

(display (sum-of-squares-of-biggers 2 1 3))
(newline)

(display (sum-of-squares-of-biggers 3 2 1))
(newline)

二つの大きい方の値をどうやって条件分岐させて見付けるのか?
その中で簡素な書き方はなんだろう?

と,そのことだけに頭を使っていた.

この時点ではまだ define による手続き定義とかand, cond, ifなどの簡単な命令しかならっていなかったので仕方がなかったとは思う.

そして,つい今しがた僕は以下のリンク先の解答を見て思わず笑みがこぼれてしまった.

http://lispuser.net/memo/lisp/2007-04-11-22-16.html