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

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

Нам нужно определить процедуру, которая принимает три числовых параметра (это коэффициенты кубического уравнения) и возвращает процедуру одного аргумента - переменной, относительно которой записано кубическое уравнение. Это несложно сделать с помощью конструкции 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