我正在尝试在 Scheme (DrRacket) 中创建程序来求解二次方程的根。我也有解决判别式的功能(功能D)。如果判别式 >0 函数根应该在两个词根的输出“点对”(这是正确的词吗?英语不是我的母语)上具有。否则它应该在输出上给出#f。
(define na2
(lambda (x)
(* x x)))
(define D
(lambda (a b c)
(- (na2 b) (* 4 a c))))
(define roots
(lambda (a b c)
((if (> (D a b c) 0)
(cons (/ (+ (- b) (sqrt (D a b c))) (* 2 a)) (/ (- (- b) (sqrt (D a b c))) (* 2 a)))
#f)))
它给了我这个:
> (roots 1 3 2)
>: contract violation
expected: real?
given: (-1 . -2)
argument position: 1st
other arguments...:
>
如您所见,输出正确,但为什么会出现错误?
编辑:我更正了错字,因为 Parakram Majumdar 帮助了我,现在它给了我
application: not a procedure;
expected a procedure that can be applied to arguments
given: (-1 . -2)
arguments...: [none]
有人可以告诉我我做错了什么吗?
正如评论中所讨论的,if
声明应写成如下:
(if cond then else)
条件是:
(> (D a b c) 0)
所以总的来说应该是:
(define roots
(lambda (a b c)
(if (> (D a b c) 0)
(cons (/ (+ (- b) (sqrt (D a b c))) (* 2 a))
(/ (- (- b) (sqrt (D a b c))) (* 2 a)))
#f
)))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句