2014年1月27日月曜日

開発環境

計算機プログラムの構造と解釈(Gerald Jay Sussman(原著)、Julie Sussman(原著)、Harold Abelson(原著)、和田 英一(翻訳)、ピアソンエデュケーション、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の1(手続きによる抽象の構築)、1.2(手続きとその生成するプロセス)、1.2.2(木構造再帰)、問題 1.13.を解いてみる。

その他参考書籍

問題 1.13.

ѱ= (1 - √5) / 2とする。

n = 0のとき。

(ɸ^0 - ѱ^0) / √5 = 0

n = 1のとき。

(ɸ^1 - ѱ^1) / √5 = (ɸ - ѱ) / √5 = √5 / √5 = 1

また、次が成り立つ。

ѱ^2 = (6 - 2√5) / 4

ѱ^2 = (3 - 2√5) / 2

ѱ^2 = ѱ + 1

このことから次が成り立つ。

(ɸ^(k - 1) - ѱ^(k - 1)) / √5 + (ɸ^(k - 2) - ѱ^(k - 2)) / √5
= (ɸ^(k - 1) - ѱ^(k - 1) + ɸ^(k - 2) - ѱ^(k - 2)) / √5
= ((ɸ + 1) * ɸ^(k - 2) - (ѱ + 1) * ѱ^(k - 2)) / √5
= (ɸ^2 * ɸ^(k - 2) - ѱ^2 * ѱ^(k - 2)) / √5
= (ѱ^k - ѱ^k) / √5

よって帰納法により次が成り立つ。

Fib (n) = (ɸ^n - ѱ^n) / √5

ここまでの証明を使うと次のことが分かる。

0 <= |Fib(n) - ɸ^n / √5|
= |(ɸ^n - ѱ^n) / √5 - ɸ^n / √5|
= |ѱ|^n / √5
= ((√5 - 1) / 2)^ n / √5
< ((3 - 1) / 2)^ n / √5
= (2 / 2)^ n / √5
= 1 / √5
< 1 / 2

よって、Fib(n)は、ɸ^n / √5 に最も近い整数である。

確認。

コード(BBEdit, Emacs)

sample.scm

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

(define phi (/ (+ 1 (sqrt 5)) 2))

(define (fib n)
  (round (/ (expt phi n) (sqrt 5))))

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

(define (fib-iter a b count)
  (if (= count 0)
      b
      (fib-iter (+ a b) a (- count 1))))

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

$ gosh
gosh> (load "./sample.scm")
#t
gosh> (fib 0)
0.0
gosh> (fib 1)
1.0
gosh> (fib 2)
1.0
gosh> (fib 3)
2.0
gosh> (fib 4)
3.0
gosh> (fib 5)
5.0
gosh> (fib 6)
8.0
gosh> (fib 7)
13.0
gosh> (fib 8)
21.0
gosh> (fib 9)
34.0
gosh> (fib 10)
55.0
gosh> (fib 100)
3.542248481792631e20
gosh> (fib-1 0)
0
gosh> (fib-1 1)
1
gosh> (fib-1 2)
1
gosh> (fib-1 3)
2
gosh> (fib-1 4)
3
gosh> (fib-1 5)
5
gosh> (fib-1 6)
8
gosh> (fib-1 7)
13
gosh> (fib-1 8)
21
gosh> (fib-1 9)
34
gosh> (fib-1 10)
55
gosh> (fib-1 100)
354224848179261915075
gosh> (exit)
$

0 コメント:

コメントを投稿