如果是else子句或cond在Racket中

时间:2015-05-04 23:22:53

标签: racket

我正在尝试在Racket中编写一个简单的程序,如果a的值为> 1则打印1,如果0和{{a = 0的值,则打印-1 1}}如果a < 0。我写了以下但看起来它没有照顾第三个条件。实际上,我没有包括第三个条件,因此我不知道如何使用&#39; if&#39;来检查所有三个条件。条款。我们非常感谢您的指导。

我是Racket的新手。我的节目是:

#lang racket
(define a 3);


(if (> a 0)
    0 
    1)
-1

提前致谢。

3 个答案:

答案 0 :(得分:6)

您正在寻找的功能已在名称sgn下定义。

您的实施不起作用的原因是它不完整。你想要:

(if (= a 0)
    0
    (if (< a 0)
        -1
        1))

或者只是看起来更好看:

(cond 
    [(negative? n) -1]
    [(positive? n)  1]
    [else 0])

答案 1 :(得分:2)

所以你如何描述它有两个后果和一个选择。然后我会使用cond

(cond ((> a 0) 1)
      ((= a 0) 0)
      (else -1))  ; if it's not greater or equal it has to be less than

对于cond每个术语,你可以预期所有前一个都是假的,因此不需要最后一个测试,因为如果它不大于或等于它必须小于0.这与写作完全相同:

(if (> a 0)
    1
    (if (= a 0) 
        0
        -1))

主要区别在于cond看起来稍微好一些。如果您需要begin(副作用),那么使用cond也会有所帮助,因为它具有隐式begin

(define seen
  (let ((hash (make-hash)))
    (lambda (x) 
      (cond ((hash-ref hash x #f) #t)
            (else (hash-set! hash x #t) #f)))))

if相同:

(define seen
  (let ((hash (make-hash)))
    (lambda (x) 
      (if (hash-ref hash x #f) 
          #t
          (begin
            (hash-set! hash x #t)
            #f)))))

它是一样的,但我觉得cond获胜,因为它的压痕更少,更平坦。

答案 2 :(得分:0)

我是CS的初学者,但是我们从Racket开始,这就是我们要做到的。而且,我只是按照您在问题中所说的去说:“如果a的值> 1,则打印1;如果a的值= 0,则打印0;如果a <0,则为-1”。

(cond
[(> a 1) 1]
[(= a 0) 0]
[(< a 0) -1])

我可能只是纯粹按照班级标准来学习CS的学生添加的东西,当我们编写使用间隔的函数时,我们总是编写适当数量的check-expect以查看是否发生了意外情况。我注意到,当a> 1,a = 0且低于0的所有值= -1时,您会发生某些事情。因此,如果您写了a = 1,并且如果对其他非> 1、0 =或<0的内容输入“ else”,则返回-1。我不知道如果a = 1会发生什么,但我想我会把它丢掉以作充分的衡量。

如果您在上面写有cond的情况下放入a = 1,则只会返回“ cond:所有问题结果均为假”。.Oki,现在我完成了。