2014年2月18日火曜日

開発環境

計算機プログラムの構造と解釈(Gerald Jay Sussman(原著)、Julie Sussman(原著)、Harold Abelson(原著)、和田 英一(翻訳)、ピアソンエデュケーション、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の1(手続きによる抽象の構築)、1.3(高階手続きによる抽象)、1.3.1(引数としての手続き)、問題 1.33-a, b.を解いてみる。

その他参考書籍

問題 1.33-a, b.

a.は反復的プロセスで手続きを書いたので、今回は再帰的プロセスで。

コード(BBEdit, Emacs)

sample.scm

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

(load "./compound_procedures.scm")

(define (filtered-accumulate combiner null-value term a next b predicate)
  (define (iter x result)
    (cond ((> x b) result)
          ((predicate x)
           (iter (next x)
                 (combiner (term x)
                           result)))
          (else (iter (next x)
                      result))))
  (iter a null-value))

;; a. 区間a, bの素数の二乗の和
(define (prime-square-sum a b)
  (filtered-accumulate + 0 square a inc b prime?))

;; b.
(define (gcd-sum n)
  (filtered-accumulate *
                       1
                       identity
                       1
                       inc
                       (- n 1)
                       (lambda (i)
                         (= (gcd i n)
                            1))))

;; テスト
(print "a.")
(for-each (lambda (x)
            (define a (car x))
            (define b (cadr x))
            (print "区間 [" a ", " b "]: " (prime-square-sum a b)))
          '((2 3) (2 4) (2 5) (2 6) (2 7)
            (5 6) (5 7) (5 8) (5 9) (5 10)))

(print "b.")
(for-each (lambda (n)
            (print "n = " n ": " (gcd-sum n)))
          '(2 3 4 5 6 7 8 9 10))

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

$ ./sample.scm 
a.
区間 [2, 3]: 13
区間 [2, 4]: 13
区間 [2, 5]: 38
区間 [2, 6]: 38
区間 [2, 7]: 87
区間 [5, 6]: 25
区間 [5, 7]: 74
区間 [5, 8]: 74
区間 [5, 9]: 74
区間 [5, 10]: 74
b.
n = 2: 1
n = 3: 2
n = 4: 3
n = 5: 24
n = 6: 5
n = 7: 720
n = 8: 105
n = 9: 2240
n = 10: 189
$

0 コメント:

コメントを投稿