(Scheme)是否可以仅使用define或math语句根据输入返回两个值中的一个?

时间:2014-09-14 19:56:26

标签: scheme

用户输入一个数字。当数字高于指定数量时,会发生一些事情。如果数字低于指定数量,则会发生其他情况。是否有可能在不使用任何布尔/条件/ ifs的情况下实现这一目标?纯粹通过数学运算或函数定义?

1 个答案:

答案 0 :(得分:0)

你可以使用sgnhash table来做到这一点,例如(在Racket中):

(define trigger-value 42) ; this is the reference value

(define action   ; defines the actions that should happen
  (hash 
   -1 (lambda () (displayln "below"))
    0 (lambda () (displayln "BINGO"))
   +1 (lambda () (displayln "above"))))

(define (test n) ; calls the right action procedure depending on n
  ((hash-ref action (sgn (- n trigger-value)))))

当n (- n trigger-value)为负。触发值,当n>时为正;触发值,如果它们相同则为0。将sgn应用于该值分别产生-1,0或1。然后使用该值在哈希表中查找应该调用哪个过程。

这里,程序只显示一行,但它们也可以返回一个值,例如,然后可以用于进一步的计算。

测试

> (test 11)
below
> (test 90)
above
> (test 42)
BINGO

修改 这是@Chris在评论中提到的解决方案:

(define action  
  (list
   (lambda () (displayln "below"))
   (lambda () (displayln "BINGO"))
   (lambda () (displayln "above"))))

(define (test n) ; calls the right action procedure depending on n
  ((list-ref action (add1 (sgn (- n trigger-value))))))

这是基于alists:

(define action  
  (list
   (list -1 (lambda () (displayln "below")))
   (list  0 (lambda () (displayln "BINGO")))
   (list +1 (lambda () (displayln "above")))))

(define (test n) ; calls the right action procedure depending on n
  ((second (assv (sgn (- n trigger-value)) action))))