sicpマラソン2日目(1)

[メモ]
  • 再帰的プロセス=置き換えモデルで遅延演算が膨張・収縮 (1.2.1)
  • 反復的プロセス=置き換えモデルで一定数の状態変数のみ更新、伸び縮みしない (1.2.1)
  • 線形再帰的プロセス=計算に必要な情報量(遅延演算の列の長さ)とステップ数が線形に成長 (1.2.1)
  • 線形反復的プロセス=計算に必要な情報量が一定(状態変数)、ステップ数は線形に成長 (1.2.1)
  • 再帰的手続き=手続き定義が構文上で自身を使う (1.2.1)
  • プロセス(process)≠手続き(procedure) (1.2.1)
  • 末尾再帰的=反復的プロセスが再帰的手続きで記述していても固定スペース(消費記憶量)で実行できる実装 (1.2.1)
[演習問題]

1.9 パターン0、パターン1で(+ 4 5)を評価

## パターン0
(define (+ a b)
        (if (= a 0)
            b
            (inc (+ (dec a) b))))
(+ 4 5)
==>(inc (+ (dec 4) 5))
==>(inc (inc (+ (dec 3) 5)))
==>(inc (inc (inc (+ (dec 2) 5))))
==>(inc (inc (inc (inc (+ (dec 1) 5)))))
==>(inc (inc (inc (inc 5))))
==>(inc (inc (inc 6)))
==>(inc (inc 7))
==>(inc 8)
==>9

パターン0は再帰的プロセス

## パターン1
(define (+ a b)
        (if (= a 0)
            b
            (+ (dec a) (inc b))))
(+ 4 5)
==>(+ 3 6)
==>(+ 2 7)
==>(+ 1 8)
==>(+ 0 9)
==>9

パターン1は反復的プロセス
1.10 Ackermann関数

(define (A x y)
        (cond ((= y 0) 0)
              ((= x 0) (* 2 y))
              ((= y 1) 2)
              (else (A (- x 1)
                       (A x (- y 1))))))
(A 1 10)
==>(A 0 (A 1 9))
==>(A 0 (A 0 (A 1 8)))
==>(A 0 (A 0 (A 0 (A 1 7))))
==>(A 0 (A 0 (A 0 (A 0 (A 1 6)))))
==>(A 0 (A 0 (A 0 (A 0 (A 0 (A 1 5))))))
==>(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 1 4)))))))
==>(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 1 3))))))))
==>(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 1 2)))))))))
==>(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 1 1))))))))))    ## y=1なので(A 1 1)==>2
==>(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 2)))))))))          ## x=0なので(A 0 2)==>2*2
==>(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 4))))))))                ## 2^3=8
==>(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 8)))))))                      ## 2^4=16
==>(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 16))))))                           ## 2^5=32
==>(A 0 (A 0 (A 0 (A 0 (A 0 32)))))                                 ## 2^6=64
==>(A 0 (A 0 (A 0 (A 0 64))))                                       ## 2^7=128
==>(A 0 (A 0 (A 0 128)))                                            ## 2^8=256
==>(A 0 (A 0 256))                                                  ## 2^9=512
==>(A 0 512)                                                        ## 2^10=1024
1024

(A 1 10)==>1024

(A 2 4)
==>(A 1 (A 2 3))
==>(A 1 (A 1 (A 2 2)))
==>(A 1 (A 1 (A 1 (A 2 1))))          ## y=1なので(A 2 1)==>2
==>(A 1 (A 1 (A 1 2)))
==>(A 1 (A 1 (A 0 (A 1 1))))          ## y=1なので(A 1 1)==>2
==>(A 1 (A 1 (A 0 2)))                ## x=0なので(A 0 2)==>2*2
==>(A 1 (A 1 4))
==>(A 1 (A 0 (A 1 3)))
==>(A 1 (A 0 (A 0 (A 1 2))))
==>(A 1 (A 0 (A 0 (A 0 (A 1 1)))))    ## y=1なので(A 1 1)==>2
==>(A 1 (A 0 (A 0 (A 0 2))))          ## x=0なので(A 0 2)==>2*2
==>(A 1 (A 0 (A 0 4)))                ## 2^3=8
==>(A 1 (A 0 8))                      ## 2^4=16
==>(A 1 16)                           ## (A 1 16)==>(A 0 (A 1 15)) ... と置き換えていってもいいけど
                                      ## (A 1 10)は2^10なので(A 1 16)は2^16と予想できる
                                      ## 2^16=65536
==>65536

(A 2 4)==>65536

(A 3 3)
==>(A 2 (A 3 2))
==>(A 2 (A 2 (A 3 1)))                ## y=1なので(A 3 1)==>2
==>(A 2 (A 2 2))
==>(A 2 (A 1 (A 2 1)))                ## y=1なので(A 2 1)==>2
==>(A 2 (A 1 2))
==>(A 2 (A 0 (A 1 1)))                ## y=1なので(A 1 1)==>2
==>(A 2 (A 0 2))                      ## x=0なので(A 0 2)==>2*2
==>(A 2 4)                            ## 前問から(A 2 4)==>65536
==>65536

(A 3 3)==>65536

## (define (f n) (A 0 n))
(A 0 n)                               ## Aの定義から
==>2*n

## (define (g n) (A 1 n))
(A 1 n)                               ## (A 1 10)から
==>2^n

## (define (h n) (A 2 n))
(A 2 n)
==>(A 1 (A 2 (- n 1)))                ## (A 1 n)==>2^nから
==>2^(A 2 (- n 1))
==>2^(A 1 (A 2 (- n 2)))
==>2^2^(A 2 (- n 2))
...
==>2^2^2...2^(A 2 1)                  ## y=1なので(A 2 1)==>2
==>2^2^2...2^2                        ## 全部でn個

以上から手続きf,g,nの数学的意義は下記の様になる

(f n) ... 2n
(g n) ... 2^n
(h n) ... 2^2^2...2^2
          ----n個----