任何人都可以帮助我这个简单的布尔方案代码?

时间:2016-10-17 05:48:42

标签: scheme racket

我需要定义XOR3,它接受布尔输入a b和c,当一个输入为真时返回true,否则返回false。永远坚持下去!

到目前为止,我有 (定义XOR3    (lambda(abc)但是idk要放什么,因为当只有一个值为真时我无法弄清楚如何变为真。我只应该使用"或""和"和"不是"。感谢任何帮助!

5 个答案:

答案 0 :(得分:3)

将其分解为更小的问题。

abc之一的真实含义是什么意思?
这意味着只有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))

所以你可以把它插入到这个功能中。

同样适用于bc

答案 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

以下解释了我的大脑如何处理这个问题:

  1. 如果ab都是#t,那么c是什么并不重要,请返回#f
  2. 现在我们只知道ab并非两者为真,所以如果c { {1}}我们可以返回#f
  3. 否则(or a b)c,这意味着#ta都不是真的 - 而不是b您可以将其视为(not (or a b))如果你愿意的话。
  4. 请务必像上面一样使用您的真值表,这样您就可以验证所有可能的(and (not a) (not b))ab分配的程序的有效性

    当然,您的下一个逻辑步骤是创建一个接受任意数量参数的通用过程;不只是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)

直接的解决方案是将orandnot一起使用,因为当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

此功能非常灵活,可用于测试任意数量的项目以获取任意数量的真值。

另见:Functional variant of 'oneof' function in Racket

答案 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();