【问题标题】:Scheme quadratic function/square root check方案二次函数/平方根检查
【发布时间】:2014-03-15 05:44:19
【问题描述】:

我想创建一个函数,其中 rootcheck 有一个列表 L 作为输入,L 始终是 3 个原子(a b c),其中 a 是 x^2 的系数,b 是 x 的系数,c 是常数。它检查方程是否是二次的,使用判别式 (b^2 - 4ac) 并且应该输出这个 (num 'L) 其中 num 是根的数量,L 是包含根本身的列表(使用二次公式),L在没有根的情况下为空。这是我的代码:

(define roots-2
    (lambda (L)
    (let ((d (- (* (cdr L) (cdr L)) (4 (car L) (caddr L))))))
    (cond ((< d 0)  (cons(0 null)))
    ((= d 0) (cons(1 null)))
    (else((> d 0) (cons(2 null)))))
            ))

它没有给我任何身体错误的表达。

我也尝试编写二次函数的代码,甚至尝试了一些在线的,一个编译的 fint 但在我插入输入时给了我一个错误这是二次函数的代码,不是我的!

(define quadratic-solutions
 (lambda (a b c) (list (root1 a b c) (root2 a b c))))
(define root1
 (lambda (a b c) (/ (+ (- b) (sqrt (discriminant a b c)))
 (* 2 a))))
(define root2
 (lambda (a b c) (/ (- (- b) (sqrt (discriminant a b c)))
 (*2 a)))) 
(define discriminant
 (lambda (a b c) (- (square b) (* 4 (* a c)))))

【问题讨论】:

  • 为什么是 CL 标签。您还在搜索 Common Lisp 答案吗?
  • 缩进不佳的代码不可读。

标签: scheme quadratic


【解决方案1】:

代码中有几个错误:

  • 有些括号放错了,使用好的IDE来检测此类问题。这导致报告的错误,let 没有正文
  • 您忘记在4ac 部分进行乘法运算
  • 您错误地访问了列表中的第二个元素
  • else 部分不能有条件
  • 输出列表构造不正确

这应该可以修复错误,现在将 null 替换为对计算第二种和第三种情况的根的函数的实际调用((&lt; d 0) 的情况很好):

(define roots-2
  (lambda (L)
    (let ((d (- (* (cadr L) (cadr L)) (* 4 (car L) (caddr L)))))
      (cond ((< d 0)  (list 0 null))
            ((= d 0)  (list 1 null))
            (else     (list 2 null))))))

【讨论】:

  • 谢谢!!我正在使用 DrRacket,有什么建议吗?
  • 使用频率的“Reindent All”选项,它在球拍菜单中。并且时不时地做一个“检查语法”,它会帮助你及早发现错误。编写一小段代码并不断测试它们。让 IDE 指导您,以标准方式缩进和右括号 - 以上所有内容都会对您有所帮助!
【解决方案2】:

对于二次函数部分,我在网上找到了一个代码并对其进行了调整以提供二次方程的两个根。返回两个根的列表

(define (solve-quadratic-equation a b c)
  (define disc (sqrt (- (* b b)
                    (* 4.0 a c))))

 (list      (/ (+ (- b) disc) (* 2.0 a))
            (/ (- (- b) disc) (* 2.0 a))
))

【讨论】:

    猜你喜欢
    • 2019-04-17
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多