【问题标题】:Can anyone help me with this simple boolean scheme code?谁能帮我这个简单的布尔方案代码?
【发布时间】:2016-10-17 05:48:41
【问题描述】:

我需要定义接受布尔输入 a b 和 c 的 XOR3,当恰好一个输入为真时返回真,否则返回假。一直卡在这上面!

到目前为止,我有 (定义 XOR3 (lambda (a b c) 但不知道该放什么,因为当只有一个值为真时,我无法弄清楚如何获得真。我只应该使用“或”“与”和“不”。任何帮助表示赞赏!

【问题讨论】:

    标签: scheme racket


    【解决方案1】:

    把它分解成更小的问题。

    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 也是如此。

    【讨论】:

    • 可能值得一提的是,这是DNF
    【解决方案2】:

    从最简单的情况开始,不断缩小范围

    (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 #f 我们可以返回@987654331 @
    3. 否则c#t,这意味着ab 都不是真的——如果你愿意,你可以把(and (not a) (not b)) 看作(and (not a) (not b)) 而不是(and (not a) (not b))

    请记住始终像我在上面所做的那样使用真值表,这样您就可以验证您的过程对abc 的所有可能分配的有效性


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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        也可以将这些项目放在一个列表中并使用计数功能:

        (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
        

        此函数非常灵活,可用于测试任意数量的项目的任意数量的真值。

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

        【讨论】:

        • 你不需要(if ... #t #f)围绕它,你可以使用(= 1 (count ...))
        【解决方案5】:
        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();
        

        【讨论】:

        • OP 正在寻求方案中的解决方案,而不是 Java 中的解决方案!
        • 与布尔值比较是没有意义的。例如,a == true 等价于aa == false 等价于!a。三元运算符的布尔结果也是没有意义的; p ? true : falsep 相同,p ? false : true!p 相同。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-03
        • 2019-08-28
        • 1970-01-01
        • 1970-01-01
        • 2015-08-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多