Решение упражнения 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

Comment from mstyura
Date: July 23, 2012, 4:20 pm

Предложенный быстрый вариант вычисления значения полинома называется схемой Горнера. http://ru.wikipedia.org/wiki/%D0%A1%D1%85%D0%B5%D0%BC%D0%B0_%D0%93%D0%BE%D1%80%D0%BD%D0%B5%D1%80%D0%B0

Write a comment