Code Review
Compare your solutions
#|
Упражнение 3.9
В разделе 1.2.1 мы с помощью подстановочной модели анализировали две процедуры вычисления факториала,
рекурсивную
(define (factorial n)
(if (= n 1)
1
(* n (factorial (- n 1)))))
и итеративную
(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)))
Продемонстрируйте, какие структуры окружений возникнут при вычислении (factorial 6) с каждой из версий
процедуры factorial.
|#
#|
Посмотрим, какие структуры окружение возникнут при вычислении первой версии factorial, которая
порождает рекурсивный процесс
Процедурные объекты в глобальном кадре окружения:
┏━━━━━━━━━━━━━━━━━━━━━━━━━┓
Глобальное ┃ ... ┃
───────────►┃ ... ┃
окружение ┃ factorial ┃
┗━━┿━━━━━━━━━━━━━━━━━━━━━━┛
▼ ▲
┏━━━┳━━━┓ │
┃ • ┃ • ╂──┘
┗━┿━┻━━━┛
│
▼
параметры: n
тело: (if (= n 1)
1
(* n (factorial (- n 1))))
Окружения, созданные при вычислении (factorial 6):
┏━━━━━━━━━━━━━━━━━━━━━━━━━┓
Глобальное ┃ ... ┃
───────────►┃ ... ┃
окружение ┃ ... ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━┛
▲ ▲ ▲ ▲ ▲ ▲
┏━━━━┷━━━━┓ │ │ │ │ │
E1 ─────►┃ n: 6 ┃ │ │ │ │ │ (if (= n 1) 1 (* n (factorial (- n 1))))
┗━━━━━━━━━┛ │ │ │ │ │
┏━━━━━━━━━┓ │ │ │ │ │
E2 ─────►┃ n: 5 ╂─┘ │ │ │ │ (if (= n 1) 1 (* n (factorial (- n 1))))
┗━━━━━━━━━┛ │ │ │ │
┏━━━━━━━━━┓ │ │ │ │
E3 ─────►┃ n: 4 ╂────┘ │ │ │ (if (= n 1) 1 (* n (factorial (- n 1))))
┗━━━━━━━━━┛ │ │ │
┏━━━━━━━━━┓ │ │ │
E4 ─────►┃ n: 3 ╂───────┘ │ │ (if (= n 1) 1 (* n (factorial (- n 1))))
┗━━━━━━━━━┛ │ │
┏━━━━━━━━━┓ │ │
E5 ─────►┃ n: 2 ╂──────────┘ │ (if (= n 1) 1 (* n (factorial (- n 1))))
┗━━━━━━━━━┛ │
┏━━━━━━━━━┓ │
E6 ─────►┃ n: 1 ╂─────────────┘ (if (= n 1) 1 (* n (factorial (- n 1))))
┗━━━━━━━━━┛
Процедурные объекты в глобальном кадре окружения:
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
Глобальное ┃ ... ┃
───────────►┃ fact-iter ──────────────────┐ ┃
окружение ┃ factorial │ ┃
┗━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━┿━━━━━━┛
▼ ▲ ▼ ▲
┏━━━┳━━━┓ │ ┏━━━┳━━━┓ │
┃ • ┃ • ╂──┘ ┃ • ┃ • ╂──┘
┗━┿━┻━━━┛ ┗━┿━┻━━━┛
│ │
▼ ▼
параметры: n параметры: product counter max-count
тело: тело:
(fact-iter 1 1 n) (if (> counter max-count)
product
(fact-iter (* counter product)
(+ counter 1)
max-count)))
Окружения, созданные при вычислении (factorial 6):
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
Глобальное ┃ ... ┃
───────────►┃ ... ┃
окружение ┃ ... ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲
┏━━━━┷━━━━┓ │ │ │ │ │ │ │
E1 ─────►┃ n: 6 ┃ │ │ │ │ │ │ │ (fact-iter 1 1 n)
┗━━━━━━━━━┛ │ │ │ │ │ │ │
┏━━━━━━━━━━━━━━┓ │ │ │ │ │ │ │ (if (> counter max-count)
┃ product: 1 ┃ │ │ │ │ │ │ │ product
E2 ─────►┃ counter: 1 ╂─┘ │ │ │ │ │ │ (fact-iter (* counter product)
┃ max-count: 6 ┃ │ │ │ │ │ │ (+ counter 1)
┗━━━━━━━━━━━━━━┛ │ │ │ │ │ │ max-count)))
┏━━━━━━━━━━━━━━┓ │ │ │ │ │ │ (if (> counter max-count)
┃ product: 1 ┃ │ │ │ │ │ │ product
E3 ─────►┃ counter: 2 ╂────┘ │ │ │ │ │ (fact-iter (* counter product)
┃ max-count: 6 ┃ │ │ │ │ │ (+ counter 1)
┗━━━━━━━━━━━━━━┛ │ │ │ │ │ max-count)))
┏━━━━━━━━━━━━━━┓ │ │ │ │ │ (if (> counter max-count)
┃ product: 2 ┃ │ │ │ │ │ product
E4 ─────►┃ counter: 3 ╂───────┘ │ │ │ │ (fact-iter (* counter product)
┃ max-count: 6 ┃ │ │ │ │ (+ counter 1)
┗━━━━━━━━━━━━━━┛ │ │ │ │ max-count)))
┏━━━━━━━━━━━━━━┓ │ │ │ │ (if (> counter max-count)
┃ product: 6 ┃ │ │ │ │ product
E5 ─────►┃ counter: 4 ╂──────────┘ │ │ │ (fact-iter (* counter product)
┃ max-count: 6 ┃ │ │ │ (+ counter 1)
┗━━━━━━━━━━━━━━┛ │ │ │ max-count)))
┏━━━━━━━━━━━━━━┓ │ │ │ (if (> counter max-count)
┃ product: 24 ┃ │ │ │ product
E6 ─────►┃ counter: 5 ╂─────────────┘ │ │ (fact-iter (* counter product)
┃ max-count: 6 ┃ │ │ (+ counter 1)
┗━━━━━━━━━━━━━━┛ │ │ max-count)))
┏━━━━━━━━━━━━━━┓ │ │ (if (> counter max-count)
┃ product: 120 ┃ │ │ product
E7 ─────►┃ counter: 6 ╂────────────────┘ │ (fact-iter (* counter product)
┃ max-count: 6 ┃ │ (+ counter 1)
┗━━━━━━━━━━━━━━┛ │ max-count)))
┏━━━━━━━━━━━━━━┓ │ (if (> counter max-count)
┃ product: 720 ┃ │ product
E8 ─────►┃ counter: 7 ╂───────────────────┘ (fact-iter (* counter product)
┃ max-count: 6 ┃ (+ counter 1)
┗━━━━━━━━━━━━━━┛ max-count)))
|#
#|
Упражнение 3.9
В разделе 1.2.1 мы с помощью подстановочной модели анализировали две процедуры вычисления факториала,
рекурсивную
(define (factorial n)
(if (= n 1)
1
(* n (factorial (- n 1)))))
и итеративную
(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)))
Продемонстрируйте, какие структуры окружений возникнут при вычислении (factorial 6) с каждой из версий
процедуры factorial.
|#
#|
Процедурные объекты в глобальном кадре окружения:
┏━━━━━━━━━━━━━━━━━━━━━━━━━┓
Глобальное ┃ ... ┃
───────────►┃ ... ┃
окружение ┃ factorial ┃
┗━━┿━━━━━━━━━━━━━━━━━━━━━━┛
▼ ▲
┏━━━┳━━━┓ │
┃ • ┃ • ╂──┘
┗━┿━┻━━━┛
│
▼
параметры: n
тело: (if (= n 1)
1
(* n (factorial (- n 1))))
Окружения, созданные при вычислении (factorial 6):
┏━━━━━━━━━━━━━━━━━━━━━━━━━┓
Глобальное ┃ ... ┃
───────────►┃ ... ┃
окружение ┃ ... ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━┛
▲ ▲ ▲ ▲ ▲ ▲
┏━━━━┷━━━━┓ │ │ │ │ │
E1 ─────►┃ n: 6 ┃ │ │ │ │ │ (if (= n 1) 1 (* n (factorial (- n 1))))
┗━━━━━━━━━┛ │ │ │ │ │
┏━━━━━━━━━┓ │ │ │ │ │
E2 ─────►┃ n: 5 ╂─┘ │ │ │ │ (if (= n 1) 1 (* n (factorial (- n 1))))
┗━━━━━━━━━┛ │ │ │ │
┏━━━━━━━━━┓ │ │ │ │
E3 ─────►┃ n: 4 ╂────┘ │ │ │ (if (= n 1) 1 (* n (factorial (- n 1))))
┗━━━━━━━━━┛ │ │ │
┏━━━━━━━━━┓ │ │ │
E4 ─────►┃ n: 3 ╂───────┘ │ │ (if (= n 1) 1 (* n (factorial (- n 1))))
┗━━━━━━━━━┛ │ │
┏━━━━━━━━━┓ │ │
E5 ─────►┃ n: 2 ╂──────────┘ │ (if (= n 1) 1 (* n (factorial (- n 1))))
┗━━━━━━━━━┛ │
┏━━━━━━━━━┓ │
E6 ─────►┃ n: 1 ╂─────────────┘ (if (= n 1) 1 (* n (factorial (- n 1))))
┗━━━━━━━━━┛
Процедурные объекты в глобальном кадре окружения:
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
Глобальное ┃ ... ┃
───────────►┃ fact-iter ──────────────────┐ ┃
окружение ┃ factorial │ ┃
┗━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━┿━━━━━━┛
▼ ▲ ▼ ▲
┏━━━┳━━━┓ │ ┏━━━┳━━━┓ │
┃ • ┃ • ╂──┘ ┃ • ┃ • ╂──┘
┗━┿━┻━━━┛ ┗━┿━┻━━━┛
│ │
▼ ▼
параметры: n параметры: product counter max-count
тело: тело:
(fact-iter 1 1 n) (if (> counter max-count)
product
(fact-iter (* counter product)
(+ counter 1)
max-count)))
Окружения, созданные при вычислении (factorial 6):
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
Глобальное ┃ ... ┃
───────────►┃ ... ┃
окружение ┃ ... ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲
┏━━━━┷━━━━┓ │ │ │ │ │ │ │
E1 ─────►┃ n: 6 ┃ │ │ │ │ │ │ │ (fact-iter 1 1 n)
┗━━━━━━━━━┛ │ │ │ │ │ │ │
┏━━━━━━━━━━━━━━┓ │ │ │ │ │ │ │ (if (> counter max-count)
┃ product: 1 ┃ │ │ │ │ │ │ │ product
E2 ─────►┃ counter: 1 ╂─┘ │ │ │ │ │ │ (fact-iter (* counter product)
┃ max-count: 6 ┃ │ │ │ │ │ │ (+ counter 1)
┗━━━━━━━━━━━━━━┛ │ │ │ │ │ │ max-count)))
┏━━━━━━━━━━━━━━┓ │ │ │ │ │ │ (if (> counter max-count)
┃ product: 1 ┃ │ │ │ │ │ │ product
E3 ─────►┃ counter: 2 ╂────┘ │ │ │ │ │ (fact-iter (* counter product)
┃ max-count: 6 ┃ │ │ │ │ │ (+ counter 1)
┗━━━━━━━━━━━━━━┛ │ │ │ │ │ max-count)))
┏━━━━━━━━━━━━━━┓ │ │ │ │ │ (if (> counter max-count)
┃ product: 2 ┃ │ │ │ │ │ product
E4 ─────►┃ counter: 3 ╂───────┘ │ │ │ │ (fact-iter (* counter product)
┃ max-count: 6 ┃ │ │ │ │ (+ counter 1)
┗━━━━━━━━━━━━━━┛ │ │ │ │ max-count)))
┏━━━━━━━━━━━━━━┓ │ │ │ │ (if (> counter max-count)
┃ product: 6 ┃ │ │ │ │ product
E5 ─────►┃ counter: 4 ╂──────────┘ │ │ │ (fact-iter (* counter product)
┃ max-count: 6 ┃ │ │ │ (+ counter 1)
┗━━━━━━━━━━━━━━┛ │ │ │ max-count)))
┏━━━━━━━━━━━━━━┓ │ │ │ (if (> counter max-count)
┃ product: 24 ┃ │ │ │ product
E6 ─────►┃ counter: 5 ╂─────────────┘ │ │ (fact-iter (* counter product)
┃ max-count: 6 ┃ │ │ (+ counter 1)
┗━━━━━━━━━━━━━━┛ │ │ max-count)))
┏━━━━━━━━━━━━━━┓ │ │ (if (> counter max-count)
┃ product: 120 ┃ │ │ product
E7 ─────►┃ counter: 6 ╂────────────────┘ │ (fact-iter (* counter product)
┃ max-count: 6 ┃ │ (+ counter 1)
┗━━━━━━━━━━━━━━┛ │ max-count)))
┏━━━━━━━━━━━━━━┓ │ (if (> counter max-count)
┃ product: 720 ┃ │ product
E8 ─────►┃ counter: 7 ╂───────────────────┘ (fact-iter (* counter product)
┃ max-count: 6 ┃ (+ counter 1)
┗━━━━━━━━━━━━━━┛ max-count)))
|#
#|
Упражнение 3.9
В разделе 1.2.1 мы с помощью подстановочной модели анализировали две процедуры вычисления факториала,
рекурсивную
(define (factorial n)
(if (= n 1)
1
(* n (factorial (- n 1)))))
и итеративную
(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)))
Продемонстрируйте, какие структуры окружений возникнут при вычислении (factorial 6) с каждой из версий
процедуры factorial.
|#
#|
Посмотрим, какие структуры окружение возникнут при вычислении первой версии factorial, которая
порождает рекурсивный процесс
Процедурные объекты в глобальном кадре окружения:
┏━━━━━━━━━━━━━━━━━━━━━━━━━┓
Глобальное ┃ ... ┃
───────────►┃ ... ┃
окружение ┃ factorial ┃
┗━━┿━━━━━━━━━━━━━━━━━━━━━━┛
▼ ▲
┏━━━┳━━━┓ │
┃ • ┃ • ╂──┘
┗━┿━┻━━━┛
│
▼
параметры: n
тело: (if (= n 1)
1
(* n (factorial (- n 1))))
Окружения, созданные при вычислении (factorial 6):
┏━━━━━━━━━━━━━━━━━━━━━━━━━┓
Глобальное ┃ ... ┃
───────────►┃ ... ┃
окружение ┃ ... ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━┛
▲ ▲ ▲ ▲ ▲ ▲
┏━━━━┷━━━━┓ │ │ │ │ │
E1 ─────►┃ n: 6 ┃ │ │ │ │ │ (if (= n 1) 1 (* n (factorial (- n 1))))
┗━━━━━━━━━┛ │ │ │ │ │
┏━━━━━━━━━┓ │ │ │ │ │
E2 ─────►┃ n: 5 ╂─┘ │ │ │ │ (if (= n 1) 1 (* n (factorial (- n 1))))
┗━━━━━━━━━┛ │ │ │ │
┏━━━━━━━━━┓ │ │ │ │
E3 ─────►┃ n: 4 ╂────┘ │ │ │ (if (= n 1) 1 (* n (factorial (- n 1))))
┗━━━━━━━━━┛ │ │ │
┏━━━━━━━━━┓ │ │ │
E4 ─────►┃ n: 3 ╂───────┘ │ │ (if (= n 1) 1 (* n (factorial (- n 1))))
┗━━━━━━━━━┛ │ │
┏━━━━━━━━━┓ │ │
E5 ─────►┃ n: 2 ╂──────────┘ │ (if (= n 1) 1 (* n (factorial (- n 1))))
┗━━━━━━━━━┛ │
┏━━━━━━━━━┓ │
E6 ─────►┃ n: 1 ╂─────────────┘ (if (= n 1) 1 (* n (factorial (- n 1))))
┗━━━━━━━━━┛
Процедурные объекты в глобальном кадре окружения:
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
Глобальное ┃ ... ┃
───────────►┃ fact-iter ──────────────────┐ ┃
окружение ┃ factorial │ ┃
┗━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━┿━━━━━━┛
▼ ▲ ▼ ▲
┏━━━┳━━━┓ │ ┏━━━┳━━━┓ │
┃ • ┃ • ╂──┘ ┃ • ┃ • ╂──┘
┗━┿━┻━━━┛ ┗━┿━┻━━━┛
│ │
▼ ▼
параметры: n параметры: product counter max-count
тело: тело:
(fact-iter 1 1 n) (if (> counter max-count)
product
(fact-iter (* counter product)
(+ counter 1)
max-count)))
Окружения, созданные при вычислении (factorial 6):
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
Глобальное ┃ ... ┃
───────────►┃ ... ┃
окружение ┃ ... ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲
┏━━━━┷━━━━┓ │ │ │ │ │ │ │
E1 ─────►┃ n: 6 ┃ │ │ │ │ │ │ │ (fact-iter 1 1 n)
┗━━━━━━━━━┛ │ │ │ │ │ │ │
┏━━━━━━━━━━━━━━┓ │ │ │ │ │ │ │ (if (> counter max-count)
┃ product: 1 ┃ │ │ │ │ │ │ │ product
E2 ─────►┃ counter: 1 ╂─┘ │ │ │ │ │ │ (fact-iter (* counter product)
┃ max-count: 6 ┃ │ │ │ │ │ │ (+ counter 1)
┗━━━━━━━━━━━━━━┛ │ │ │ │ │ │ max-count)))
┏━━━━━━━━━━━━━━┓ │ │ │ │ │ │ (if (> counter max-count)
┃ product: 1 ┃ │ │ │ │ │ │ product
E3 ─────►┃ counter: 2 ╂────┘ │ │ │ │ │ (fact-iter (* counter product)
┃ max-count: 6 ┃ │ │ │ │ │ (+ counter 1)
┗━━━━━━━━━━━━━━┛ │ │ │ │ │ max-count)))
┏━━━━━━━━━━━━━━┓ │ │ │ │ │ (if (> counter max-count)
┃ product: 2 ┃ │ │ │ │ │ product
E4 ─────►┃ counter: 3 ╂───────┘ │ │ │ │ (fact-iter (* counter product)
┃ max-count: 6 ┃ │ │ │ │ (+ counter 1)
┗━━━━━━━━━━━━━━┛ │ │ │ │ max-count)))
┏━━━━━━━━━━━━━━┓ │ │ │ │ (if (> counter max-count)
┃ product: 6 ┃ │ │ │ │ product
E5 ─────►┃ counter: 4 ╂──────────┘ │ │ │ (fact-iter (* counter product)
┃ max-count: 6 ┃ │ │ │ (+ counter 1)
┗━━━━━━━━━━━━━━┛ │ │ │ max-count)))
┏━━━━━━━━━━━━━━┓ │ │ │ (if (> counter max-count)
┃ product: 24 ┃ │ │ │ product
E6 ─────►┃ counter: 5 ╂─────────────┘ │ │ (fact-iter (* counter product)
┃ max-count: 6 ┃ │ │ (+ counter 1)
┗━━━━━━━━━━━━━━┛ │ │ max-count)))
┏━━━━━━━━━━━━━━┓ │ │ (if (> counter max-count)
┃ product: 120 ┃ │ │ product
E7 ─────►┃ counter: 6 ╂────────────────┘ │ (fact-iter (* counter product)
┃ max-count: 6 ┃ │ (+ counter 1)
┗━━━━━━━━━━━━━━┛ │ max-count)))
┏━━━━━━━━━━━━━━┓ │ (if (> counter max-count)
┃ product: 720 ┃ │ product
E8 ─────►┃ counter: 7 ╂───────────────────┘ (fact-iter (* counter product)
┃ max-count: 6 ┃ (+ counter 1)
┗━━━━━━━━━━━━━━┛ max-count)))
|#
#|
Упражнение 3.9
В разделе 1.2.1 мы с помощью подстановочной модели анализировали две процедуры вычисления факториала,
рекурсивную
(define (factorial n)
(if (= n 1)
1
(* n (factorial (- n 1)))))
и итеративную
(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)))
Продемонстрируйте, какие структуры окружений возникнут при вычислении (factorial 6) с каждой из версий
процедуры factorial.
|#
#|
Процедурные объекты в глобальном кадре окружения:
┏━━━━━━━━━━━━━━━━━━━━━━━━━┓
Глобальное ┃ ... ┃
───────────►┃ ... ┃
окружение ┃ factorial ┃
┗━━┿━━━━━━━━━━━━━━━━━━━━━━┛
▼ ▲
┏━━━┳━━━┓ │
┃ • ┃ • ╂──┘
┗━┿━┻━━━┛
│
▼
параметры: n
тело: (if (= n 1)
1
(* n (factorial (- n 1))))
Окружения, созданные при вычислении (factorial 6):
┏━━━━━━━━━━━━━━━━━━━━━━━━━┓
Глобальное ┃ ... ┃
───────────►┃ ... ┃
окружение ┃ ... ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━┛
▲ ▲ ▲ ▲ ▲ ▲
┏━━━━┷━━━━┓ │ │ │ │ │
E1 ─────►┃ n: 6 ┃ │ │ │ │ │ (if (= n 1) 1 (* n (factorial (- n 1))))
┗━━━━━━━━━┛ │ │ │ │ │
┏━━━━━━━━━┓ │ │ │ │ │
E2 ─────►┃ n: 5 ╂─┘ │ │ │ │ (if (= n 1) 1 (* n (factorial (- n 1))))
┗━━━━━━━━━┛ │ │ │ │
┏━━━━━━━━━┓ │ │ │ │
E3 ─────►┃ n: 4 ╂────┘ │ │ │ (if (= n 1) 1 (* n (factorial (- n 1))))
┗━━━━━━━━━┛ │ │ │
┏━━━━━━━━━┓ │ │ │
E4 ─────►┃ n: 3 ╂───────┘ │ │ (if (= n 1) 1 (* n (factorial (- n 1))))
┗━━━━━━━━━┛ │ │
┏━━━━━━━━━┓ │ │
E5 ─────►┃ n: 2 ╂──────────┘ │ (if (= n 1) 1 (* n (factorial (- n 1))))
┗━━━━━━━━━┛ │
┏━━━━━━━━━┓ │
E6 ─────►┃ n: 1 ╂─────────────┘ (if (= n 1) 1 (* n (factorial (- n 1))))
┗━━━━━━━━━┛
Процедурные объекты в глобальном кадре окружения:
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
Глобальное ┃ ... ┃
───────────►┃ fact-iter ──────────────────┐ ┃
окружение ┃ factorial │ ┃
┗━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━┿━━━━━━┛
▼ ▲ ▼ ▲
┏━━━┳━━━┓ │ ┏━━━┳━━━┓ │
┃ • ┃ • ╂──┘ ┃ • ┃ • ╂──┘
┗━┿━┻━━━┛ ┗━┿━┻━━━┛
│ │
▼ ▼
параметры: n параметры: product counter max-count
тело: тело:
(fact-iter 1 1 n) (if (> counter max-count)
product
(fact-iter (* counter product)
(+ counter 1)
max-count)))
Окружения, созданные при вычислении (factorial 6):
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
Глобальное ┃ ... ┃
───────────►┃ ... ┃
окружение ┃ ... ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲
┏━━━━┷━━━━┓ │ │ │ │ │ │ │
E1 ─────►┃ n: 6 ┃ │ │ │ │ │ │ │ (fact-iter 1 1 n)
┗━━━━━━━━━┛ │ │ │ │ │ │ │
┏━━━━━━━━━━━━━━┓ │ │ │ │ │ │ │ (if (> counter max-count)
┃ product: 1 ┃ │ │ │ │ │ │ │ product
E2 ─────►┃ counter: 1 ╂─┘ │ │ │ │ │ │ (fact-iter (* counter product)
┃ max-count: 6 ┃ │ │ │ │ │ │ (+ counter 1)
┗━━━━━━━━━━━━━━┛ │ │ │ │ │ │ max-count)))
┏━━━━━━━━━━━━━━┓ │ │ │ │ │ │ (if (> counter max-count)
┃ product: 1 ┃ │ │ │ │ │ │ product
E3 ─────►┃ counter: 2 ╂────┘ │ │ │ │ │ (fact-iter (* counter product)
┃ max-count: 6 ┃ │ │ │ │ │ (+ counter 1)
┗━━━━━━━━━━━━━━┛ │ │ │ │ │ max-count)))
┏━━━━━━━━━━━━━━┓ │ │ │ │ │ (if (> counter max-count)
┃ product: 2 ┃ │ │ │ │ │ product
E4 ─────►┃ counter: 3 ╂───────┘ │ │ │ │ (fact-iter (* counter product)
┃ max-count: 6 ┃ │ │ │ │ (+ counter 1)
┗━━━━━━━━━━━━━━┛ │ │ │ │ max-count)))
┏━━━━━━━━━━━━━━┓ │ │ │ │ (if (> counter max-count)
┃ product: 6 ┃ │ │ │ │ product
E5 ─────►┃ counter: 4 ╂──────────┘ │ │ │ (fact-iter (* counter product)
┃ max-count: 6 ┃ │ │ │ (+ counter 1)
┗━━━━━━━━━━━━━━┛ │ │ │ max-count)))
┏━━━━━━━━━━━━━━┓ │ │ │ (if (> counter max-count)
┃ product: 24 ┃ │ │ │ product
E6 ─────►┃ counter: 5 ╂─────────────┘ │ │ (fact-iter (* counter product)
┃ max-count: 6 ┃ │ │ (+ counter 1)
┗━━━━━━━━━━━━━━┛ │ │ max-count)))
┏━━━━━━━━━━━━━━┓ │ │ (if (> counter max-count)
┃ product: 120 ┃ │ │ product
E7 ─────►┃ counter: 6 ╂────────────────┘ │ (fact-iter (* counter product)
┃ max-count: 6 ┃ │ (+ counter 1)
┗━━━━━━━━━━━━━━┛ │ max-count)))
┏━━━━━━━━━━━━━━┓ │ (if (> counter max-count)
┃ product: 720 ┃ │ product
E8 ─────►┃ counter: 7 ╂───────────────────┘ (fact-iter (* counter product)
┃ max-count: 6 ┃ (+ counter 1)
┗━━━━━━━━━━━━━━┛ max-count)))
|#