方案:解决任务而不使用if / cond?

时间:2015-01-30 11:29:43

标签: scheme racket

理论上,我的任务相当简单。

“创建一个以整数作为参数的过程。如果整数为0,则返回0.如果整数小于0,则返回-1。如果整数大于0,则返回1.

使用if / cond解决此任务不带(允许的唯一特殊表单是 define )。“

一项非常不切实际的任务,但仍然是我课程的要求。我已经坚持了几个小时这个任务,所以我喜欢一些意见!

请记住,程序必须返回-1,0或1. #t或#f不够好。

2 个答案:

答案 0 :(得分:6)

andor都是if的特殊版本。例如

(and a b)           ; is the same as
(if a b #f)

(and a b c ...)         ; is the same as
(if a (and b c ...) #f)

(or a b)    ; is the same as
(if a
    a       ; though a is only evaluated once!
    b)

(or a b c ...)  ; is the same as
(if a
    a           ; though a is only evaluated once!
    (or b c ...))

请注意,对于3个或更多元素,结果中包含andor。您只需应用相同的转换,直到只有if

如果你想要这样的东西:

(if a 'x 'y)

你看到它显然是(or (and a 'x) 'y),因为它变成了

(if (if a 'x #f)
    (if a 'x #f)
    'y)

知道除#f之外的所有值都被视为真值。 “反向”执行此操作的基本方法是了解andor短路如何if。如果您需要返回一个特殊值而不是您使用的谓词的结果,那么:

(and (null? x) 'empty-result)

如果您需要假值来继续逻辑,请使用or

(or (and (null? x) 'empty-result)
    (and (pair? x) 'pair-result))

如果您需要默认设置并拥有or,则只需添加它即可。

(or (and (null? x) 'empty-result)
    (and (pair? x) 'pair-result)
    'default-result)

如果您碰巧在外部有and,则需要包裹or以获取默认结果:

(or (and ...)
    'default-result)
祝你好运!

答案 1 :(得分:2)

这是一个非常简单的实现:

(define (signum n)
  (or (and (zero? n) 0)
      (and (positive? n) 1)
      (and (negative? n) -1)))

编辑:我在阅读Sylwester的帖子之前写了我的答案,但你肯定应该读一下这个结构如何运作的理论。