我需要定义XOR3,它接受布尔输入a b和c,当一个输入为真时返回true,否则返回false。永远坚持下去!
到目前为止,我有 (定义XOR3 (lambda(abc)但是idk要放什么,因为当只有一个值为真时我无法弄清楚如何变为真。我只应该使用"或""和"和"不是"。感谢任何帮助!
答案 0 :(得分:3)
将其分解为更小的问题。
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
。
答案 1 :(得分:1)
从最简单的情况开始,并继续缩小范围
(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
是 { {1}}我们可以返回#f
(or a b)
为c
,这意味着#t
或a
都不是真的 - 而不是b
您可以将其视为(not (or a b))
如果你愿意的话。请务必像上面一样使用您的真值表,这样您就可以验证所有可能的(and (not a) (not b))
,a
和b
分配的程序的有效性
当然,您的下一个逻辑步骤是创建一个接受任意数量参数的通用过程;不只是3
c
别忘了查看真相表
(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))]))
答案 2 :(得分:0)
直接的解决方案是将or
与and
和not
一起使用,因为当a
为真且其余为假或{{1}时,您的过程应该为真是真的,其余为假,或者b
为真,其余为假。
c
答案 3 :(得分:0)
还可以将这些项目放在列表中并使用计数功能:
(define (f a b c)
(if (= 1
(count
(lambda(x) x)
(list a b c)))
#t #f ))
或者@AlexKnauth在以下评论中提出的简化版本:
(define (f a b c)
(= 1
(count
(lambda(x) x)
(list a b c) )))
测试:
(f #t #f #f)
(f #t #t #f)
输出:
#t
#f
此功能非常灵活,可用于测试任意数量的项目以获取任意数量的真值。
答案 4 :(得分:-3)
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();