3

2つの数値のGCFに対するユークリッドの互除法は次のとおりGCF(a, b)=GCF(b, a mod b)です。私はこれがPythonで次のように実装されているのを見てきました:

def gcf(a, b):
    return b and gcf(b, a%b) or a

この関数を解析する方法、具体的にはブール論理を整数に適用する方法がわかりません。たとえば、gcf(42, 56) = 14。それを見ていくと、最終的に再帰部分がゼロを返すことがわかります。0 or n == n私はそれに従います0 and n == 0。ただし、ゼロ以外の整数のペアを比較したり、ロジックを使用したりすると、何が発生し、その理由がわかりません。

誰かが私にこの機能を教えてもらえますか?

4

4 に答える 4

2

Pythonのブール演算子'または'および'および'はブール値を返しません。比較している値の1つを返します。

0またはn-nを返します

0およびn-0を返します

a and b or c(a ? b : c)Cで構文を実装するための単なるトリックです。

Pythonのブール演算とこのトリックの詳細については、DiveintoPythonのセクション4.6をお読みください。

于 2010-12-19T02:39:13.960 に答える
1

あなたの場合、コールスタックは次のようになります。

gcf(42、56)
gcf(56、42)// bがゼロ以外だったので、再帰して42%56(= 42)を2番目の引数として
渡しますgcf(42、14)// bがゼロ以外だったので、再帰して56%42(= 14)を2番目の引数として渡しますgcf(14、0)// b
がゼロ以外だったので、42%14(= 0)を再帰して2番目の引数として渡します
ゼロ、(14)を返すだけです

これは一番上までポップします。Pythonでは、とはブール値ではなく数値を返します。そのため、ポップアップは1/trueではなく結果を返します。

于 2010-12-19T02:54:35.423 に答える
1

ただし、ゼロ以外の整数のペアを比較したり、ロジックを使用したりすると、何が発生し、その理由がわかりません。

結果に影響を与える最初の値が返されます

x or y->ブロックx内のコードが実行されるたびに評価され、それ以外の場合はに評価されます。if x:y

x and y->ブロックx内のコードが実行されない場合は常に評価され、それ以外の場合はに評価されますif x:y

それが起こる理由は、GvRがそう言ったからです。x if C else yおそらく、構造が言語に追加される前に、このトリックを機能させることが正確に行われた可能性があります。

しかし、あなたは知っています...あなたはあなた自身のためにそれをテストすることができたかもしれません。それがREPLの目的です:)

于 2010-12-19T05:15:38.827 に答える
0

bがゼロに等しくない場合、結果はgcf(b、a%b)(再帰)になります。bがゼロに等しい場合、結果はaになります。

于 2010-12-19T02:39:41.183 に答える