LoginSignup
0
0

More than 5 years have passed since last update.

SICP読書女子会 #42 (3.2.1)

Last updated at Posted at 2017-09-11

3.2

実行した関数が作る環境について?

Ex 3.9

再帰バージョン

(define (factorial n)
    (if (= n 1) 1 (* n #?=(factorial (- n 1)))))
Trace
CALL factorial 6
#?="./ex3.9.scm":2:(factorial (- n 1))
  CALL factorial 5
#?="./ex3.9.scm":2:(factorial (- n 1))
    CALL factorial 4
#?="./ex3.9.scm":2:(factorial (- n 1))
      CALL factorial 3
#?="./ex3.9.scm":2:(factorial (- n 1))
        CALL factorial 2
#?="./ex3.9.scm":2:(factorial (- n 1))
#?-    1
        RETN factorial 2
#?-    2
      RETN factorial 6
#?-    6
    RETN factorial 24
#?-    24
  RETN factorial 120
#?-    120
RETN factorial 720

反復バージョン

(define (factorial n) (fact-iter 1 1 n))
(define (fact-iter product counter max-count)
    (if 
        (> counter max-count)
        product
        (fact-iter (* counter product) (+ counter 1) max-count)))

Trace
CALL factorial 6
RETN factorial 720

解答ver1

Ex.3.9 修正

誰が読んだかは関係なくて、その関数の空間が何をみてるかを指してる

(define (factorial n) (fact-iter 1 1 n))
(define (fact-iter product counter max-count)
(if (> counter max-count)
product
(fact-iter (* counter product)
(+ counter 1)
max-count)))

  • global <- factorial
  • global <- fact-iter

例えば

(define (a x)
    (define (b y) '1)
    (define (c z) '2)
)
global <- a <- b
          ↑c

b,cはaが見えてるし, globalも見えてる

  1. (a 1) を呼ぶと, その時に1つ新しいフレーム (E1) ができて, E1 -> global と, 引数用の x = 1 で初期化される.
  2. (a 1) の実行ステップが (define (b x) ...) にたどり着くと, E1 の中に b っていう名前が増える この時はフレームは増えない

つまりこんなかんじ

なので・・・

解答ver2

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0