用户输入一个数字。当数字高于指定数量时,会发生一些事情。如果数字低于指定数量,则会发生其他情况。是否有可能在不使用任何布尔/条件/ ifs的情况下实现这一目标?纯粹通过数学运算或函数定义?
答案 0 :(得分:0)
你可以使用sgn和hash 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 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))))