2015年2月5日木曜日

開発環境

計算機プログラムの構造と解釈[第2版](ハロルド エイブルソン (著)、ジュリー サスマン (著)、ジェラルド・ジェイ サスマン (著)、Harold Abelson (原著)、Julie Sussman (原著)、Gerald Jay Sussman (原著)、和田 英一 (翻訳)、翔泳社、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の1(手続きによる抽象の構築)、1.2(手続きとその生成するプロセス)、1.2.4(べき乗)、問題 1.19.を解いてみる。

その他参考書籍

問題 1.19.

a'=bq+aq+ap b'=bp+aq a''=b'q+a'q+a'p =(bp+aq)q+(bq+aq+ap)q+(bq+aq+ap)p =b(2pq+ q 2 )+a(2 q 2 +2pq+ p 2 ) =b(2pq+ q 2 )+a(2pq+ q 2 )+a( q 2 + p 2 ) b''=b'p+a'q =(bp+aq)p+(bq+aq+ap)q =b( p 2 + q 2 )+a(2pq+ q 2 ) p'= p 2 + q 2 ,q'=2pq+ q 2 a''=bq'+aq'+ap' b''=bp'+aq'

コード(BBEdit, Emacs)

sample19.scm

#!/usr/bin/env gosh
;; -*- coding: utf-8 -*-

(define square (lambda (x) (* x x)))
(define even? (lambda (n) (= (remainder n 2) 0)))

(define (fib n)
  (fib-iter 1 0 0 1 n))

(define (fib-iter a b p q count)
  (cond ((= count 0) b)
        ((even? count)
         (fib-iter a
                   b
                   (+ (square p) (square q))
                   (+ (* 2 p q) (square q))
                   (/ count 2)))
        (else
         (fib-iter (+ (* b q) (* a q) (* a p))
                   (+ (* b p) (* a q))
                   p
                   q
                   (- count 1)))))

(for-each
 (lambda (n)
   (print "(fib " n "): " (fib n)))
 (list 1 2 3 4 5 6 7 8 9 10 100 101 102))

入出力結果(Terminal(gosh), REPL(Read, Eval, Print, Loop))

$ ./sample19.scm
(fib 1): 1
(fib 2): 1
(fib 3): 2
(fib 4): 3
(fib 5): 5
(fib 6): 8
(fib 7): 13
(fib 8): 21
(fib 9): 34
(fib 10): 55
(fib 100): 354224848179261915075
(fib 101): 573147844013817084101
(fib 102): 927372692193078999176
$

0 コメント:

コメントを投稿