問題4.8 – SICP(計算機プログラムの構造と解釈)その181
2009年05月17日
問題4.8
名前付き let
で書いた Fibonacci 手続きは、
(define (fib n) (let fib-iter ((a 1) (b 0) (count n)) (if (= count 0) b (fib-iter (+ a b) a (- count 1)))))
次の手続きに書き直せる。
(define (fib n) (define (fib-iter a b count) (if (= count 0) b (fib-iter (+ a b) a (- count 1)))) (fib-iter 1 0 n))
これにもとづいて、名前付き let
が使えるようにする。
(define (let->combination exp) (if (pair? (car (let-clauses exp))) (expand-let-clauses (let-clauses exp)) (expand-named-let-clauses (let-clauses exp)))) (define (named-let-var clauses) (car clauses)) (define (named-let-bindings clauses) (cadr clauses)) (define (named-let-body clauses) (caddr clauses)) (define (expand-named-let-clauses clauses) (make-begin (list (list 'define (cons (named-let-var clauses) (map car (named-let-bindings clauses))) (named-let-body clauses)) (cons (named-let-var clauses) (map cadr (named-let-bindings clauses))))))
実行結果
;;; M-Eval input: (define (fib n) (let fib-iter ((a 1) (b 0) (count n)) (if (= count 0) b (fib-iter (+ a b) a (- count 1))))) ;;; M-Eval value: ok ;;; M-Eval input: (fib 10) ;; M-Eval value: 55
計算機プログラムの構造と解釈
posted with amazlet at 08.11.07
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
ピアソンエデュケーション
売り上げランキング: 6542