Sat, 14 Jul 2007

SICP独習: 問題1.12 Pascalの三角形

ぼちぼち取り組んでいますが、なかなか進みません。やっと問題1.12です。 でも、学生時代は情報系じゃなかったのでこういうのやってなかったからなんだか 新鮮で楽しいです。

問題を解こうと思ったら、やっぱりSchemeがわからないと解けないような気がするので SICPを一時中断してSchemeの勉強を軽くしてました。

で、問題1.12を解いてみました。こんな感じでどうだろう。

#!/usr/bin/env gosh

(define pascal-triangle-each
    (lambda (x y)
        (cond ((= x 0) 1)
              ((= x y) 1)
              (else
                (+ (pascal-triangle-each (- x 1) (- y 1))
                   (pascal-triangle-each x (- y 1)))))))

(define pascal-triangle-itr
    (lambda (x y l)
        (if (= x 0) (print (cons 1 l))
            (pascal-triangle-itr (- x 1) y (cons (pascal-triangle-each x y) l)))))

(define pascal-triangle
    (lambda (count)
        (pascal-triangle-itr count count '())))

(map pascal-triangle '(0 1 2 3 4 5 6))

実行結果はこんな感じ。

% gosh pascal-triangle.scm
(1)
(1 1)
(1 2 1)
(1 3 3 1)
(1 4 6 4 1)
(1 5 10 10 5 1)
(1 6 15 20 15 6 1)

Mon, 18 Jun 2007

SICP独習: 問題1.5, 1.7

  • 作用的順序の評価

    引数をまず評価し、作用させる

  • 正規順序の評価

    完全に展開し、簡約する。いわゆる遅延評価のことっぽい。

通常Lispは、作用的順序の評価を使っているが、このような一般的評価規則の例外を 特殊形式と呼ぶ。

1.1章で出てきた特殊形式は、define/cond/if

問題1.5は、作用的順序で評価する場合には、無限ループする引数を最初に評価して しまうため無限ループに落ちいってしまうが、正規順序で評価した場合には、無限ループ に落ちいる引数は、if文で評価されないため無限ループに落ちいらない。

問題1.7は、new-ifを自分で定義した場合にはnew-ifは特殊形式ではなく一般評価規則 に基づいて評価される、すなわち最初にまず引数を評価するために再帰処理を実施 する引数を最初に評価してしまう。そのため無限ループに落ちいってしまう。ifを使った 場合には、再帰処理を実施する引数は評価されないため無限ループに落ちいらない。


Fri, 01 Jun 2007

SICP買っちゃいました

しばらく前はerlangを勉強していたのですが、なんか瞬間風速的に流行ってしまったので ちょっとやる気をそがれてしまい、一旦保留にすることにしました。 文法的には変ってるものの、意外と気にいってるのと、流行ったことによって色んな人 がコード書いたり、考察してくれたので今後再開する時には役に立つのかな、とは思います。


で、「計算機プログラムの構造と解釈」。前から気になってはいたのですが、久しぶりに

のページを見てみたら読み終わってたんだね。すごいなー半年間も継続できるって。 継続できるって、一種の才能だよね。

ということで、なんだか無性に読みたくなったので、amazonでポチッと購入してみました。

計算機プログラムの構造と解釈

ASIN: 489471163X



本日、amazonから届きました。

まずは、11ページの問題1.3まで読んで問題やりました。 amazonレビューでは、やたら翻訳が悪い悪いって書かれてるけど、別に気にならないけどなー? 多少直訳的なところや若干は意味のよくわからない所もあるものの、日本語として読める というだけで十分ありがたいと思います。


問題の回答は下記を参考にさせて頂きます。

なんとか最後まで読み通してみたいと思っています。