【问题标题】:Scheme::R5RS. Trying to make the absolute value procedure方案::R5RS。尝试做绝对值程序
【发布时间】:2020-02-14 08:26:39
【问题描述】:

我正在尝试使绝对值过程和代码出错。我不知道为什么:/

(define (abs x)
   (cond ((> x 0) x)
       ((= x 0) 0)
       ((< x 0) (- x))))

错误信息:

define-values: assignment disallowed;
 cannot change constant
  constant: abs

【问题讨论】:

  • 库中已经有abs 函数。将您的 abs 重命名为其他名称。 Racket 也不允许您使用 set! 对其进行变异。
  • 另外,0 不应被视为一个单独的案例
  • 这是Racket R5RS吗?

标签: scheme r5rs


【解决方案1】:

abs 过程已经是您使用的语言的一部分,您无法创建另一个同名的过程。简单地重命名它(顺便说一下,实现可以简化一点):

(define (myabs x)
  (cond ((>= x 0) x)
        (else (- x))))

【讨论】:

  • 谢谢! +为什么我们必须在 -x (line3) 周围加上括号?我试过没有,它没有显示正确的结果。
  • @Jayjay 我们需要括号,因为我们使用单个参数调用- 过程:x。如果你写了-x 它不会工作,Scheme 认为-x 是一个不存在的变量名,因为破折号可以是变量名的一部分
  • @Jayjay 此外,-abs 也是变量,它们评估为过程值。
【解决方案2】:

这是您问题的简单解决方案。

(define (abs x)
(if (< x 0) (* x -1) (* x 1)))

这是 DrRacket 中的结果:

> (abs -4)
4

> (abs 3)
3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 2012-10-28
    • 2015-03-24
    • 2012-09-06
    • 2012-03-16
    相关资源
    最近更新 更多