【问题标题】:DrRacket/Scheme: not a procedureDrRacket/方案:不是程序
【发布时间】: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

标签: scheme racket


【解决方案1】:

正如 cmets 中所讨论的,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
)))

【讨论】:

    猜你喜欢
    • 2013-05-14
    • 2018-08-22
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    相关资源
    最近更新 更多