【发布时间】:2016-10-17 05:48:41
【问题描述】:
我需要定义接受布尔输入 a b 和 c 的 XOR3,当恰好一个输入为真时返回真,否则返回假。一直卡在这上面!
到目前为止,我有 (定义 XOR3 (lambda (a b c) 但不知道该放什么,因为当只有一个值为真时,我无法弄清楚如何获得真。我只应该使用“或”“与”和“不”。任何帮助表示赞赏!
【问题讨论】:
我需要定义接受布尔输入 a b 和 c 的 XOR3,当恰好一个输入为真时返回真,否则返回假。一直卡在这上面!
到目前为止,我有 (定义 XOR3 (lambda (a b c) 但不知道该放什么,因为当只有一个值为真时,我无法弄清楚如何获得真。我只应该使用“或”“与”和“不”。任何帮助表示赞赏!
【问题讨论】:
把它分解成更小的问题。
a、b、c 中的一个是真的是什么意思?
这意味着只有a 是真的,或者只有b 是真的,或者只有c 是真的。
所以你的函数将具有结构
(define (xor3 a b c)
(or only-a
only-b
only-c))
下一步:只有a 为真是什么意思?
这意味着a 为真,b 不为真,c 不为真。
也就是说,
(and a (not b) (not c))
这样您就可以将其插入函数中。
b 和 c 也是如此。
【讨论】:
从最简单的情况开始,不断缩小范围
(define (xor3 a b c)
(cond [(and a b) #f] ; explanation step 1
[(false? c) (or a b)] ; explanation step 2
[else (not (or a b))])) ; explanation step 3
(xor3 #t #t #t) ; => #f
(xor3 #t #t #f) ; => #f
(xor3 #t #f #t) ; => #f
(xor3 #t #f #f) ; => #t
(xor3 #f #t #t) ; => #f
(xor3 #f #t #f) ; => #t
(xor3 #f #f #t) ; => #t
(xor3 #f #f #f) ; => #f
这是我的大脑如何处理这个的解释:
a和b都是#t,不管c是什么,返回#f
a 和b 不是两者 都为真,所以如果c 是 #f 我们可以返回@987654331 @
c 是#t,这意味着a 或b 都不是真的——如果你愿意,你可以把(and (not a) (not b)) 看作(and (not a) (not b)) 而不是(and (not a) (not b))。请记住始终像我在上面所做的那样使用真值表,这样您就可以验证您的过程对a、b 和c 的所有可能分配的有效性
当然,您的下一个合乎逻辑的步骤是创建一个接受任意数量参数的通用过程;不只是 3
(define (xor a b . xs)
(cond [(and a b) #f]
[(empty? xs) (or a b)]
[else (apply xor (or a b) (car xs) (cdr xs))]))
别忘了检查真值表
(xor #t #t #t #t) ; => #f
(xor #t #t #t #f) ; => #f
(xor #t #t #f #t) ; => #f
(xor #t #t #f #f) ; => #f
(xor #t #f #t #t) ; => #f
(xor #t #f #t #f) ; => #f
(xor #t #f #f #t) ; => #f
(xor #t #f #f #f) ; => #t
(xor #f #t #t #t) ; => #f
(xor #f #t #t #f) ; => #f
(xor #f #t #f #t) ; => #f
(xor #f #t #f #f) ; => #t
(xor #f #f #t #t) ; => #f
(xor #f #f #t #f) ; => #t
(xor #f #f #f #t) ; => #t
(xor #f #f #f #f) ; => #f
【讨论】:
直接的解决方案是将or与and和not一起使用,因为当a为真而其余为假或b为真而其余为假时,您的过程应该为真或c 为真,其余为假。
(define (xor3 a b c)
(or (and a (not b) (not c))
(and b (not a) (not c))
(and c (not a) (not b))))
【讨论】:
也可以将这些项目放在一个列表中并使用计数功能:
(define (f a b c)
(if (= 1
(count
(lambda(x) x)
(list a b c)))
#t #f ))
或者,@AlexKnauth 在下面的 cmets 中建议的简化版本:
(define (f a b c)
(= 1
(count
(lambda(x) x)
(list a b c) )))
测试:
(f #t #f #f)
(f #t #t #f)
输出:
#t
#f
此函数非常灵活,可用于测试任意数量的项目的任意数量的真值。
【讨论】:
(if ... #t #f)围绕它,你可以使用(= 1 (count ...))
bool a=true, b=false, c=false;
Label1.Text = ((a == true && b == false && c == false)
|| (a == false && b == true && c == false)
|| (a == false && b == false && c == true) ? true : false).ToString();
【讨论】:
a == true 等价于a,a == false 等价于!a。三元运算符的布尔结果也是没有意义的; p ? true : false 与 p 相同,p ? false : true 与 !p 相同。