此代码中使用了许多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])]))
答案 0 :(得分:0)
我个人会将您的表达式转换为match
语句:
(define (q1a x)
(match x
[(p1? and p2?) 'down]
[p1? 'up]
[p2? 'left]
[_ 'right]))
如果您必须使用cond
,则必须略微重写您的cond表达式,因为您的cond
不是有效的表达式。您必须在car
个cond
表达式的每个(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))
现在,当您将术语数量加倍时,您将使平均运行时间加倍,而第一项只会增加一个谓词,如果您设法找到将空间减半的区别方法。通常是一厢情愿的想法,所以你最终会得到一些东西。