year年功能;这个解决方案如何运作?

时间:2018-11-06 08:45:59

标签: javascript equality boolean-logic

问题是这样的:

给出一年,如果是a年则报告。

这里棘手的事情是公历发生occurs年:

on every year that is evenly divisible by 4
  except every year that is evenly divisible by 100
    unless the year is also evenly divisible by 400

(有效的)我的解决方案是这样的:

export const isLeap = (year) => {
    const yearModFour = (year % 4) === 0 
    const yearModHundred = (year % 100) === 0
    const yearModFourHundred = (year % 400) === 0 
    const isLeapYear = yearModFour === yearModHundred === yearModFourHundred
    return isLeapYear
}

我之所以得出这个结论,是因为我想念逻辑为:

on every year that is evenly divisible by 4
  and also evenly divisible by 100
    and also evenly divisible by 400

我的问题是,为什么这会以某种方式起作用?

我不确定为什么不使用&&操作数,但是那样就不会那样了

2 个答案:

答案 0 :(得分:4)

让我们看一下谓词yearModFour === yearModHundred === yearModFourHundred,并列出一些可能带来所有可能性的数字。

对于第1年,谓词的评估结果为:

(False === False) === False
             True === False
                 False

对于第4年,谓词的评估结果为:

(True === False) === False
           False === False
                 True

对于100年,谓词评估为:

(True === True) === False
           True === False
               False

对于400年,该谓词的评估结果为:

(True === True) === True
           True === True
                True

现在这就是所有可能,这里不再赘述。这是因为除以400的任何数字都可以除以100、4和1。 100除以4和1也是如此;等等。

所以您的结论不太正确,因为它暗示所有模运算之间的逻辑“与”。

答案 1 :(得分:3)

我会提供技术解答。

让A =可被4整除,B =可被100整除,C =可被400整除。visible年的定义是:

(A and (not B)) or C

但是你写道:

(A === B) === C

对于A,B和C的所有可能一致值,我们需要询问这些公式在逻辑上是否等效。我们不必尝试A,B和C的所有组合,因为这些公式在逻辑上不是等效的一般而言:

A  B  C   (A & !B)  (A & !B | C)    A==B   (A==B)==C
------------------------------------------------------
T  T  T     F            T          T        T
T  T  F     F            F          T        F 
T  F  T     T            T          F        F   x
T  F  F     T            T          F        T
F  T  T     F            T          F        F   x    
F  T  F     F            F          F        T   x
F  F  T     F            T          T        T 
F  F  F     F            F          T        F
但是,并不是所有可能的A,B和C值都是一致的,因为它们彼此依赖。只要C为真(可被400整除),其他的也必须为真。只要B为真,A也必须为真。因此,我们唯一需要考虑的情况是:

A  B  C   (A & !B)  (A & !B | C)    A==B   (A==B)==C
------------------------------------------------------
T  T  T     F            T          T        T
T  T  F     F            F          T        F 
T  F  F     T            T          F        T
F  F  F     F            F          T        F

这是仅有的四种可能的情况(TTT,TTF,TFF和FFF)。在这四种情况下,(A&!B | C)的真值与(A == B)== C的真值相同,因此您的代码有效。

通常,这些公式并不相同,但是在这种情况下,您还可以。