转换球拍代码,使其仅使用一个Cond

时间:2016-09-26 20:40:08

标签: racket conditional-statements

此代码中使用了许多cond我必须转换此代码并仅使用cond一次,我无法做到。

(define (q1a x) (cond [(p1? x) (cond [(p2? x) ’down] [else ’up])] [else (cond [(p2? x) ’left] [else ’right])]))

转换代码后我只能使用cond函数但我可以使用和,或者我收到此错误 这是错误:期望一个带有问题和答案的条款,但找到了一个包含3个部分的条款

    (define (qla x)
      (cond[(p1? x)(p2? x)'down]
       [(else 'up)]
       [(or[(p2? x)'left]
       [else 'right])]))

3 个答案:

答案 0 :(得分:0)

我个人会将您的表达式转换为match语句:

(define (q1a x)
  (match x
    [(p1? and p2?) 'down]
    [p1? 'up]
    [p2? 'left]
    [_ 'right]))

如果您必须使用cond,则必须略微重写您的cond表达式,因为您的cond不是有效的表达式。您必须在carcond表达式的每个(define (qla x) (cond [(and (p1? x) (p2? x)) 'down] [(p1? x) 'up] [(p2? x) 'left] [else 'right])) 中都有一个声明,返回一个真值,您可以按如下方式编写:

lineterminator='n'

答案 1 :(得分:0)

我认为and将解决你的困境。您实际上只是使用cond类似if声明,因为您似乎已经注意到它并非预期用途。尝试这样的事情:

(define (qla x)
    (cond [(and (p1? x) (p2? x)) 'down]
          [(and (p1? x) (not (p2? x)) 'up)]
          [(p2? x) 'left] ; (p1? x) must be false
          [else 'right]))

答案 2 :(得分:0)

你为什么要这样?由于您的cond只有一个后续术语,而另一个我可以将其写为嵌套if

(define (q1a x) 
 (if (p1? x) 
     (if  (p2? x)
          'down 
          'up) 
     (if  (p2? x)
          'left 
          'right)))

无论结果是什么,你都不会使用两个以上的谓词,所以它是log(n)项。如果你要使用一个cond,那么效果会稍差:

(cond ((and (p1? x) (p2? x)) 'down)
      ((p1? x) 'up) ; checking only one since the other is false
      ((p2? x) left)
      (else 'right))

现在,当您将术语数量加倍时,您将使平均运行时间加倍,而第一项只会增加一个谓词,如果您设法找到将空间减半的区别方法。通常是一厢情愿的想法,所以你最终会得到一些东西。