Решение упражнения 1.40 из SICP
Нам нужно определить процедуру, которая принимает три числовых параметра (это коэффициенты кубического уравнения) и возвращает процедуру одного аргумента - переменной, относительно которой записано кубическое уравнение. Это несложно сделать с помощью конструкции lambda:
(define (cubic a b c) (lambda (x) (+ (* x x x) (* a x x) (* b x) c)))
Попробуем вычислить с помощью созданной процедуры корень уравнения x³ - 8 = 0:
> (newtons-method (cubic 0 0 -8) 1) 2.000000000036784
Возможно, более эффективным методом была бы следующая запись той же процедуры (в этом случае выполняется меньшее количество бинарных операций умножения), но для того, чтобы это утверждать, следует провести эксперимент:
(define (cubic a b c) (lambda (x) (+ (* x (+ (* x (+ x a)) b)) c)))
Comments
Comment from vovka
Date: March 18, 2010, 4:49 pm
да, действительно, на моей машине второй вариант вычисляется примерно в 3 раза быстрее
36 (define (t_cubic) (newtons-method (cubic 0 0 -8) 1))
37 (define (t_cubic2) (newtons-method (cubic2 0 0 -8) 1))
38
39 (time_test t_cubic)
40 (time_test t_cubic2)
vovka@vovkas:~/Documents/study/scheme$ ./1_40.ss
2.00000000003678 --- 94 mks
2.00000000003678 --- 29 mks
Write a comment