2016-08-15 12 views
4

「正しい(論理的に)」はどちらですか? 閏年特有のもので、一般的にはではありません。括弧付きうるう年の論理論理:かっこを含むか?

  1. return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0) 
    
  2. なし

    return year % 4 == 0 and year % 100 != 0 or year % 400 == 0 
    

追加情報

ブール値が評価される順序が括弧で変更されます(andor括弧の前になります)。

この問題では、すべての大きな数値が小さい数値で割り切れるとすれば、正しい結果が返されますが、私はまだ興味があります。括弧の

守っ効果:括弧なし

  1. False and True or True 
    #True 
    
    False and (True or True) 
    #False 
    
  2. False and False or True 
    #True 
    
    False and (False or True) 
    #False 
    

、たとえ年は、それはまだ4(最初のブール値)で割り切れないシナリオがありますTrueを返す(私はこの問題では不可能だと知っています)! 4桁で割り切れないので、かっこを入れる方が正しいですか?他に何か私はここに注意を払うべきですか?誰かが括弧を含まない/理論的論理を説明できますか?

+3

かっこでは、デフォルトの左から右の代わりに評価の順序が変更されます。だから、あなたは実際にそれらを植え付ける前に注文を変える理由を持っていなければなりません。 –

+3

コメントを残しても、私はdownvotedを意味しません。 –

答えて

1

回答:は3とは対照的に、彼らは2回の別々の論理テストである理由括弧


John Kugelmanは、説明を含める - >最後の2が一緒にグループ化する必要があります。

  1. 年でなければなりません
  2. (2)400で割り切れる場合を除き、100で表示してはならない(3)。

カッコが付いたバージョンは、この2つのルールに最もよく似ています。

return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0) 
     ^^^^^^^^^^^^^  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
      (1)       (2) 

偶然にも、括弧を削除すると、コードを破壊しないが、それはルールの不自然なバージョンにつながる:

  1. 年4によってではなく、100で割り切れる必要があります。または
  2. 年は、私はうるう年のルールを考える方法ではない400

で割り切れる必要があります。 mrdomobotoに触発


、100/400例外!:

年100が例外と400で、4で割り切れる必要がありますが、例外の例外であるが、彼らはまだ唯一の例外されています合計で(上記参照)。つまり、年が4で割り切れない場合は、すべてがFalseでなければなりません。これを確実にする唯一の方法は、False and boolが常にFalseを返すため、例外を回避することです。

JBallin

  1. False and True or True 
    #True 
    
    False and (True or True) 
    #False 
    
  2. False and False or True 
    #True 
    
    False and (False or True) 
    #False 
    

Adam Smithから、この例は、コードに英語を翻訳下記参照:

を4で割り切れるすべての年はうるう年です、unそれほど彼らはに変換され、100およびNOT 400で割り切れるで割り切れます:

return y % 4 == 0 and not (y % 100 == 0 and y % 400 != 0) 

JBallinDe Morgan's Lawsを引用:

not(a and b) = (not a or not b) 

希望の答えに上記変換するには:

#convert using "DML" 
return y % 4 == 0 and (not y % 100 == 0 or not y % 400 != 0) 
#remove "not"s by switching "==" and "!=" 
return y % 4 == 0 and (y % 100 != 0 or y % 400 == 0) 
5

括弧は、あなたのブーリアンが何を取るかに影響します。 or sは前and sがそう、一緒にグループ化され、解決されています

a and b or c 

は次のようになります。

(a and b) or c 

かのどちらかBOTH abはtruthyあり、OR cがtruthyであれば、我々はTrueを取得します。あなたが得る括弧付き

:両方aはtruthyあるとb OR cどちらかがtruthyある場合

a and (b or c) 

は今、あなたはTrueを取得します。


「正解」という限り、コードが正しい結果を得ている限り、「より正確」は意見の問題です。結果がより明確になるような気がするところには、括弧が含まれています。

if some_long_identifier and some_other_long_identifier or \ 
    some_third_long_identifier_on_another_line: 

ご案内Pythonコードを書くことがPEP8あるべきとき:たとえば:それはより(私の意見では)より明らかではないが、しかし

if (a and b) or c: 

if a and b or c: 

よりも明らかです。 PEP8は、括弧を含む必要があるときに静かです(操作の自然な順序に従う括弧を読んでください)ので、最善の判断を下してください。うるう年の


具体的には、ロジックは次のとおりです。

  1. 年が4で割り切れる場合は、年が100で割り切れる場合は2 ...
  2. に進みます。 ...
  3. 年が400で均等に割り切れる場合は、手順4に進みます。
  4. 年はうるう年です(366日あります)。
  5. 年はうるう年ではありません(365日あります)。言い換えれば

:答えは「もっとある

return y % 4 == 0 and not (y % 100 == 0 and y % 400 != 0) 
+1

「追加情報」に既に記載されていますが、質問には答えません。閏年の問題については一般的に質問しています。 – JBallin

+0

@JBallin次に、あなたの質問を再記述する必要があります。 –

+0

最後の行は、論理的にどのように(bまたはc)を分けることができるかを示しています。また、 - [デモルガンの法則](https://en.wikipedia.org/wiki/De_Morgan's_laws):not(a and b)= not a aまたはnot b – JBallin

2

:彼らは400で割り切れる100で割り切れるとしていない場合を除き、すべての年の4で割り切れるはに変換され、うるう年ですなぜ?

より正確であるかどうかは、」ではありません。どのような論理を実装したいですか? のブール値の式が変更されましたorder of operations。これにより、実行を優先させることができます。うるう年式中ロジックとして

>>> (True or True) and False # or expression evaluates first. 
False 
>>> True or True and False # and evaluates first. 
True 

次のように、rules行く:

  1. リープ年均等(例えば2012として4によって分割することができる任意の年であります、2016など)

  2. 100で均等に割り切れる場合を除いて、2100 、2200など)

  3. が均一400によって分割することができる場合を除き、それは(例えば、2000、2400通りである)

したがって例外ルールがある、優先しなければなりません数式の規則に従うためにorのまわりの括弧が必要な理由他の点では、andの2つの引数が最初に評価されます。

+0

私はこれを「追加情報」に記載しました – JBallin

+0

@JBallinもっと論理的な説明で更新されました。 – ospahiu

+0

あなたは言っている: "(4で割り切れる)AND(例外ではない)"? – JBallin

3

括弧を入れてください。英語では、ルールがある:それは400

で割り切れるでない限り

  1. 年4
  2. 年で割り切れる必要があり、括弧付きのバージョンは、この2と一致して、100で見えてはいけません最善のルールがあります。

    return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0) 
         ^^^^^^^^^^^^^  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
          (1)       (2) 
    

    偶然にも、括弧を削除すると、コードを破壊しないが、それはルールの不自然なバージョンにつながる:

    1. 年4によってではなく、100で割り切れる必要があります。または
    2. 年は、私はうるう年のルールを考える方法ではない400

    で割り切れる必要があります。

1

"正しい"と答えた理由は何ですか? (うるう年ロジックに固有ではなく、一般的には)

戻り年%4 == 0と(年%100!= 0または年%400 == 0)

括弧

なし

リターン年%4 == 0と年100%!= 0または年%400 == 0

は、 "より正確" のあなたの定義に依存します。ご存知のように、どちらも正しいです。

「より正確さ」を推測する - パフォーマンス上の利点を指している場合、私は現在のスマートコンパイラを考慮して考えることはできません。

ビューの人間の読みやすさのポイントを議論している場合は、私は行くだろう、

戻り年%4 == 0と年100%!= 0または年%400 == 0

これは、視覚的に2つの互いに素な要素を含むように見える、あなたの他の選択肢とは反対に、自然に範囲を絞り込みます。

私は、提案する括弧が含まれていますが、以下のようになります:0

リターン(!今年%4 == 0と年%100 = 0)、または年%400 ==を

1

あなたが指摘したように、400で割り切れる数は100で割り切れるので、4で割り切れることを意味するので、違いはありません。操作上、カッコが効果を持つかどうかは、字句言語の順序(評価の順序)。今日のほとんどの言語は、演算子の指定された優先順位を意味するcの慣習に従い、それ以外の場合は左から右への規則に従います。不確かな場合は、常に括弧を付けて読みやすくしています。

文体的には、この種のものは、そのような長い表現に入れば読みにくいです。それは一つの式でなければならない場合、私は、だから私は、最適化コンパイラ

return (year%400 == 0) or (year%100 != 0 and year%4 == 0) 

あるいは

bool IsLeap = false; 
if (year%4 == 0) IsLeap = true; 
if (year%100 == 0) IsLeap = false; 
if (year%400 == 0) IsLeap = true; 

return IsLeap; 

をします行くだろう「和の積」に論理的な「積の和」を持つことを好むだろうとにかく、効率的なコードを作ってください。そして、このようなことは、私のような貧しい人間を本当に助けてくれます。