2016-07-24 4 views
-6

「大規模な数学的問題 - 無限のビジョン」、18ページイアンスチュワートはユークリッドの命題2、要素VIIIを参照しました。これは非常に基本的な除数を見つける基本的な方法です。私は引用しています。これは、大きい方の数字から小さい方の数字を繰り返し減算した後、同様の処理を残りの数字と小さい数字に適用し、残りがなくなるまで続きます」例は630と135です。135は630(495,360,225)から再差し引かれ、最終的に135より小さい90が得られます。したがって、数値は逆になり、最終的には90から減算され、最終的に45次に90から45を減算し、最後に0を得てgcdを45にする。これは、gcdを見つけるユークリッドアルゴリズムと呼ばれることもあります。Pythonでのユークリッドアルゴリズム(減算)

初心者(10歳の子供)を教えるには、コードをPythonで記述する必要があります。関数定義は存在してはいけません。また、減算以外の数学演算も使用する必要はありません。 if/while/else/elif/continue/breakを使いたいです。 3つの数字(またはそれ以上)が与えられれば、全体のプログラムはより小さなものを決めることを繰り返さなければならないという規定があるはずです。 gcdの以前のチェーンでは、この観点からアルゴリズムが見えません。 pythonであなただけの直接の分画モジュールが提供するGCD関数を使用すると思い、実際には

def gcd(x, y): 
    while y != 0: 
     (x, y) = (y, x % y) 

    return x 

:GCDアルゴリズムに

+4

私はPythonで(拡張)ユークリッドアルゴリズムの何千もの実装があると信じています。どちらをチェックしましたか?何が彼らに間違っていたのですか? –

+0

さて、 'gcd'(' sin'、 'cos'、' max'、 'min'など)はおそらく関数でなければなりません。数学では 'gcd(1,3,5)'と書いています。これは単なる関数呼び出しです。 – ForceBru

+0

私はそのアルゴリズムの具体的な要件について言及しました。私は教育的理由からそれに固執する。私はそれに会った人は誰も見つかりませんでした最初の段落で述べたように、「減算」ではなく「除算」に関心を持って利用可能なもの。私は参照ができればうれしいでしょう - Andrea Corbelini – Biplab

答えて

0

典型的な高速なソリューションは、このようないくつかの反復バージョンになります。あなたはあなただけ減らす使用したい複数の値に対処するために、このような機能を望んでいた場合

はまた:

reduce(gcd,your_array) 

を今、あなたが対処するので、一つの可能​​な解決策だけループ+ substractionsを使用するために自分自身を制限したいようですxは、yの正の整数は、このようになります:

def gcd_unopt(x, y): 
    print x,y 

    while x!=y: 
     while x>y: 
      x -= y 
      print x,y 
     while y>x: 
      y -= x 
      print x,y 

    return x 

print reduce(gcd_unopt,[630,135]) 

わからないあなたが機能を使用しないようにしたかった理由は、GCDは、定義によって機能が、そうであっても、それは単に関数の宣言を取り除くと使用します、簡単ですですグローバル変数としてのパラメータ。例:

x = 630 
y = 135 

print x,y 

while x!=y: 
    while x>y: 
     x -= y 
     print x,y 
    while y>x: 
     y -= x 
     print x,y 
+0

ありがとう。しかし、プログラムは単に入力された値を返します。さらに、これは私の初期の意図と同じように、この単純なアルゴリズムを "関数定義"を使わずにPythonで実装できないということですか? Cでは、2つのネストされたwhileを使っていくつかの行を使ってこれを行うことができます。 – Biplab

+0

@Biplab私は自分のコメントを編集しました。あなたが「プログラムは単に入力された値を返す」という意味ではわかりません。いずれの場合でも、答えは、最適化されていないアルゴリズムがどのように実行されるかを子供に示すためのプリントを提供する。 – BPL

+0

BPLに感謝します。それは私の目的を果たし、実際にはより多くを提供します。 – Biplab