Month: August, 2007

Решение упражнения 1.10 из SICP

18 August, 2007 (19:34) | Решения упражнений | 1 comment

Что ж, рассчитаем функцию Аккермана для указанных значений.
Сразу хочу уточнить, что определение функции Аккермана, данное в SICP, отличается от определения из некоторых других источников, например из Википедии (не только русскоязычной) и MathWorld. Впрочем, для решения поставленной перед нами задачи это не является существенным.
Сначала из условия сразу увидим, что
(f n) = (A 0 n) = 2*n.
Далее […]

Решение упражнения 1.9 из SICP

17 August, 2007 (20:02) | Решения упражнений | 2 comments

Понимание рекурсивных процессов и хвостовой рекурсии (tail recursion) чрезвычайно важно для создания эффективных программ в функциональном стиле. В этом упражнении нам нужно будет сравнить два процесса для получения одного и того же результата с помощью одинаковых элементарных средств.
Первый процесс породит такую последовательность:
(+ 4 5)
(inc (+ 3 5))
(inc (inc (+ 2 5)))
(inc (inc (inc (+ 1 5))))
(inc […]

Решение упражнения 1.8 из SICP

15 August, 2007 (23:40) | Решения упражнений | 1 comment

Это упражнение не слишком сложное, поэтому на его решении можно заодно продемонстрировать и внутренние определения процедур.
Вот полное решение:
(define (qbrt-iter guess x)
  (if (good-enough? guess x)
      guess
      (qbrt-iter (improve guess x)
                 x)))
(define (good-enough? guess x)
  (< (abs (- (qube guess) x)) 0.001))
(define (qube x) (* x x x))
(define (improve guess x)
  (/ (+ (/ x (square […]

Решение упражнения 1.7 из SICP

15 August, 2007 (23:25) | Решения упражнений | 4 comments

Перед тем, как что-то разрабатывать, как нас просят в упражнении, сначала убедимся в том, что проблема, которую мы хотим преодолеть, путем усовершенствования кода, действительно существует.
(define (sqrt-iter guess x)
  (if (good-enough? guess x)
      guess
      (sqrt-iter (improve guess x)
                 x)))
(define (good-enough? guess x)
  (< (abs (- (square guess) x)) 0.001))
(define (square x) (* x x))
(define (improve guess x)
  […]

Решение упражнения 1.6 из SICP

15 August, 2007 (20:49) | Решения упражнений | No comments

Отличное упражнение на понимание того, как происходит выполнение процедур.
Вспомним прошлое упражнение и тот факт, что Scheme при интерпретации использует аппликативный порядок вычислений. Итак, как же будет вычисляться фунция Лизы?
(define (sqrt-iter guess x)
  (new-if (good-enough? guess x)
          guess
          (sqrt-iter (improve guess x)
                     x)))
При вычислении new-if сначала должны быть вычислены все ее аргументы. С первыми двумя из […]

Решение упражнения 1.5 из SICP

14 August, 2007 (22:38) | Решения упражнений | No comments

Итак, аппликативный порядок вычислений и нормальный.
При аппликативном порядке вычислений сначала полностью вычисляются операнды, а затем происходит вычисление процедуры с вычисленными значениями операндов. То есть при вычислении
(test 0 (p))
прежде всего (до собственно выполнения операций из тела процедуры) нужно будет вычислить (p). Но по хитрому определению для вычисления значения (p) необходимо вычислить… опять же (p). Таким образом интерпретатор зацикливается.
При нормальном […]

Решение упражнения 1.4 из SICP

14 August, 2007 (22:23) | Решения упражнений | No comments

Итак, нам предлагают код процедуры:

(define (a-plus-abs-b a b)
  ((if (> b 0) + -) a b))
Работает она очень просто и естественно (особенно если не вспоминать об ограничениях многих императивных языков). Так как операции + и - являются такими же полноправными членами языка, как и переменные, мы можем включать их в любые языковые конструкции. В данном […]

Решение упражнения 1.3 из SICP

14 August, 2007 (22:13) | Решения упражнений | 6 comments

В третьем упражнении мы напишем самостоятельно первую процедуру.
Используем введенные в главе процедуры

(define (square a)  (* a a))

(define (sum-of-squares a b)
  (+ (square a) (square b)))
и запишем:

(define (sum-of-biggest-squares a b c)
  (cond ((and (>= a c) (>= b c)) (sum-of-squares a b))
        ((and (>= a b) (>= c b)) (sum-of-squares a c))
        (else (sum-of-squares […]

Решение упражнения 1.2 из SICP

14 August, 2007 (00:37) | Решения упражнений | No comments

Второе упражнение первой главы тоже не представляет собой особенной сложности. Все естественно:

(/ (+ 5 4 (- 2 (- 3 (+ 6 (/ 4 5)))))
(* 3 (- 6 2) (- 2 7)))

Решение упражнения 1.1 из SICP

13 August, 2007 (20:22) | Решения упражнений | No comments

Что ж, приступим к решению упражнений. Первое упражнение несложное.

> 10
10

> (+ 5 3 4)
12

> (- 9 1)
8

> (/ 6 2)
3

> (+ (* 2 4) (- 4 6))
6

> (define a 3)

> (define b (+ a 1))

> (+ a b (* a b))
19

> (= a b)
#f

> (if (and […]