Month: October, 2007
28 October, 2007 (22:12) | Личное | No comments
Давно не делал записей не по основной теме ресурса. Надо слегка отвлечься.
На выходных был впервые в Харькове (гостем на свадьбе). Город в целом оставил приятное впечатление, не последнюю роль в чем, думаю, сыграла отличная для конца октября солнечная и теплая погода. К сожалению, свободного времени было в обрез, потому много про харьковские достопримечательности и особый […]
25 October, 2007 (22:38) | Решения упражнений | No comments
Нам нужно определить процедуру, которая принимает три числовых параметра (это коэффициенты кубического уравнения) и возвращает процедуру одного аргумента - переменной, относительно которой записано кубическое уравнение. Это несложно сделать с помощью конструкции lambda:
(define (cubic a b c)
(lambda (x) (+ (* x x x) (* a x x) (* b x) c)))
Попробуем вычислить с помощью созданной […]
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))
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 […]
24 October, 2007 (21:05) | Решения упражнений | No 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. Эталон […]
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))
Определим функции, неподвижные точки которых […]
24 October, 2007 (20:02) | Решения упражнений | 1 comment
По определению из раздела 1.2.2 золотое сечение (φ) - это число, удовлетворяющее соотношению
φ² = φ + 1.
Разделив на φ обе части равенства, получим φ = 1 + 1/φ, из чего следует, что φ является неподвижной точкой отображения (функции, трансформации) x → 1 + 1/x.
Вычислить значение φ с помощью процедуры fixed-point совсем просто. Достаточно передать этой процедуре функцию […]
18 October, 2007 (22:44) | Решения упражнений | No comments
Смысл процедуры f заключается в том, что она вызывает процедуру, переданную ей как параметр, с аргументом 2. Таким образом область допустимых значений аргумента функции f - множество всех одноаргументных функций, которые нормально воспринимают значение аргумента, равное 2.
Сама функция f явно не удовлетворяет этому условию (принимает не числовой аргумент, а функцию). То есть вызов f для самой […]
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 может […]
18 October, 2007 (21:24) | Решения упражнений | No comments
Вот теперь мы сведем сложение и умножение фактически к одному процессу. Разница в реализации будет минимальная, что подтверждает близость этих понятий.
Сначала запишем процедуру 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) […]