DrRacket / Scheme:不是一个程序

时间:2018-01-02 08:32:18

标签: scheme racket

我正在尝试在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]

有人可以告诉我我做错了什么吗?

1 个答案:

答案 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
)))
相关问题