LINUX.ORG.RU

scheme непонятная ошибка


0

0

Написал простенькую программку, вроде должно работать. Вычисляет функцию методом бисекций. Но интерпретатор выдает странную ошибку.

(define e 2.7182818284590452353602874)

;(define (f x) (+ x (expt e (* -1 x))))

(define (f x) (x))

(define (good_section? a b) (< (* (f a) (f b)) 0))

(define (guess  a b m) (
                          (cond  ((= (f a) 0) a)
                                 ((= (f b) 0) b)
                                 ((= (f m) 0) m)
                                 (else
                                       (cond ((good_section?  a m)
                                                               (guess  a m (/ (+ a m) 2))
                                             )
                                             ((good_section?  m b)
                                                               (guess  m b (/ (+ m b) 2))
                                             )
                                             (else m)
                                       )
                                 )
                          )
                        )
)

(define (bissect a b) (guess  a b (/ (+ a b) 2)))

(bissect -1 0)

Ошибка 

;ERROR: Wrong type to apply:  -1
; in expression: (x)
; in scope:
;   (x)  procedure f
;STACK TRACE
1; ((x))
2; (((#@cond ((#@= (#@f #@a) 0) a) ((= (f b) 0) b) ((= (f m) 0) m ...
3; (#@bissect -1 0)

Помогите =)
★★★★

Ответ на: комментарий от UrbanSerj

Нет, дело не в э том. там выше закомментирована функция, которую и надо подсчитать. F(x) это просто для теста.

OxiD ★★★★
() автор топика

Я не знаток всяких методов, но есть подозрение, что не совсем правильно определена функция f. Дело в том, что при вызове (f a) , будет вычисляться (a). А у нас сразу же сходу идёт вызов (f -1), то есть вычисление выражения (-1), что невозможно.

Laz ★★★★★
()
Ответ на: комментарий от Laz

Да ты видимо прав.. Но когда вычисляется выражение (-1), его значение по идее должно быть -1? Как это по другому сделать? например (- 9) нормально работает 8(

OxiD ★★★★
() автор топика

>> (define (guess a b m) (

Накуа тут открывающая скобка после (guess a b m) ? Убери ее иначе вместо возврата -1/2 интерпретатор пытается вызвать (-1/2)

cathode
()
Ответ на: комментарий от OxiD

(define (guess  a b m) (^H
                          (cond  ((= (f a) 0) a)
                                 ((= (f b) 0) b)
                                 ((= (f m) 0) m)
                                 (else
                                       (cond ((good_section?  a m)
                                                               (guess  a m (/ (+ a m) 2))
                                             )
                                             ((good_section?  m b)
                                                               (guess  m b (/ (+ m b) 2))
                                             )
                                             (else m)
                                       )
                                 )
                          )
                        )^H
)

UrbanSerj
()
Ответ на: комментарий от UrbanSerj

Да, спасибо!! так работает ))

OxiD ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.