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