Month: October, 2007

Поездка в Харьков

28 October, 2007 (22:12) | Личное | No comments

Давно не делал записей не по основной теме ресурса. Надо слегка отвлечься.
На выходных был впервые в Харькове (гостем на свадьбе). Город в целом оставил приятное впечатление, не последнюю роль в чем, думаю, сыграла отличная для конца октября солнечная и теплая погода. К сожалению, свободного времени было в обрез, потому много про харьковские достопримечательности и особый […]

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

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

Нам нужно определить процедуру, которая принимает три числовых параметра (это коэффициенты кубического уравнения) и возвращает процедуру одного аргумента - переменной, относительно которой записано кубическое уравнение. Это несложно сделать с помощью конструкции lambda:
(define (cubic a b c)
  (lambda (x) (+ (* x x x) (* a x x) (* b x) c)))
Попробуем вычислить с помощью созданной […]

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

25 October, 2007 (21:15) | Решения упражнений | No comments

Еще одно простое упражнение, сроди упражнению 1.38.
Просто приведу определение процедуры для вычисления тангенса по формуле Ламберта:
(define (tan-cf x k)
  (cont-frac (lambda (i) (if (= i 1) x (- (* x x))))
             (lambda (i) (- (* 2 i) 1))
             k))

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

25 October, 2007 (21:09) | Решения упражнений | 1 comment

Это упражнение совсем простое и основывается на результатах предыдущего.
Определим процедуру для вычисления приближения к числу e (здесь параметр - это число элементов в конечной цепной дроби):
(define (e k)
  (+ 2 (cont-frac (lambda (i) 1.0)
                  (lambda (i) (if (= (remainder i 3) 2)
                                     (* 2 (/ (+ i 1) 3))
                                     1))
                  k)))
Вычислим приближение при 10 и 100 […]

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

24 October, 2007 (21:05) | Решения упражнений | 2 comments

Сначала реализуем процедуру cont-frac, порождающую рекурсивный процесс:
> (define (cont-frac n d k)
    (define (iter i)
      (/ (n i) (+ (d i)
                  (if (< i k)
                      (iter (+ i 1))
                      0))))
    (iter 1))
> (/ 1 (cont-frac (lambda (i) 1.0) (lambda (i) 1.0) 100))
1.618033988749895
Найдем число итераций, необходимых для вычисления φ с точностью до четвертого знака с помощью cont-frac. Эталон […]

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

24 October, 2007 (20:26) | Решения упражнений | No comments

Добавим отладочную печать в процедуру fixed-point следующим образом:
(define tolerance 0.00001)
(define (fixed-point f first-guess)
  (define (close-enough? v1 v2)
    (< (abs (- v1 v2)) tolerance))
  (define (try guess iteration)
    (display iteration)
    (display “:t”)
    (display guess)
    (newline)
    (let ((next (f guess)))
         (if (close-enough? guess next)
             next
             (try next (+ iteration 1)))))
  (try first-guess 1))
Определим функции, неподвижные точки которых […]

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

24 October, 2007 (20:02) | Решения упражнений | 1 comment

По определению из раздела 1.2.2 золотое сечение (φ) - это число, удовлетворяющее соотношению
φ² = φ + 1.
Разделив на φ обе части равенства, получим φ = 1 + 1/φ, из чего следует, что φ является неподвижной точкой отображения (функции, трансформации) x → 1 + 1/x.
Вычислить значение φ с помощью процедуры fixed-point совсем просто. Достаточно передать этой процедуре функцию […]

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

18 October, 2007 (22:44) | Решения упражнений | 1 comment

Смысл процедуры f заключается в том, что она вызывает процедуру, переданную ей как параметр, с аргументом 2. Таким образом область допустимых значений аргумента функции f - множество всех одноаргументных функций, которые нормально воспринимают значение аргумента, равное 2.
Сама функция f явно не удовлетворяет этому условию (принимает не числовой аргумент, а функцию). То есть вызов f для самой […]

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

18 October, 2007 (21:49) | Решения упражнений | 2 comments

Процедура, реализующая фильтрующий аккумулятор, будет иметь следующий вид:
(define (filtered-accumulate combiner null-value term a next b filter)
  (if (> a b)
      null-value
      (if (filter a)
          (combiner (term a)
                    (filtered-accumulate combiner null-value term (next a) next b filter))
          (filtered-accumulate combiner null-value term (next a) next b filter))))
Сумма квадратов простых чисел в интервале от a до b может […]

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

18 October, 2007 (21:24) | Решения упражнений | 1 comment

Вот теперь мы сведем сложение и умножение фактически к одному процессу. Разница в реализации будет минимальная, что подтверждает близость этих понятий.
Сначала запишем процедуру accumulate в двух вариантах, порождающих соответственно рекурсивный и итеративный процессы.
Рекурсивный вариант:
(define (accumulate combiner null-value term a next b)
  (if (> a b)
      null-value
      (combiner (term a)
                (accumulate combiner null-value term (next a) […]