我正在尝试在Scheme(DrRacket)中创建程序来解决二次方程的根。我还有解决判别的功能(功能D)。如果判别式> 0,则函数root应该在输出"点对"两个根源都是正确的单词吗?英语不是我的母语。否则它应该在输出上给出#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 helepd我,现在它给了我
application: not a procedure;
expected a procedure that can be applied to arguments
given: (-1 . -2)
arguments...: [none]
有人可以告诉我我做错了什么吗?
答案 0 :(得分:2)
正如评论中所讨论的,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
)))