【发布时间】:2018-01-02 08:32:18
【问题描述】:
我正在尝试在 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]
谁能告诉我我做错了什么?
【问题讨论】:
-
我用过scheme的其他方言,if语句写成如下:(if cond then else),条件是(> (D a b c) 0)。所以总的来说它应该是(if(>(D a b c)0)(cons(...))#f)。您能否确认这是您的代码中的拼写错误?还是这不适用于 DrRacket?
-
你是对的。我纠正了它。现在它给了我:应用程序:
not a procedure; expected a procedure that can be applied to arguments given: (-1 . -2) arguments...: [none]请问您知道出了什么问题吗? -
它对我有用
(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))) -
是的! if 附近的括号错误:-D 非常感谢大家!
-
现在你已经创建了一个duplicate of this