2016-06-16 7 views
0

oclに2つの正の整数(それらを正確に分割する最大の整数)の最大公約数を返す演算gcd(x : Integer, y : Integer) : Integerをどのように書くことができますか?ここでoclの最大公約数

答えて

0

は、このためのシンプルなソリューションです(確かに効果的ではないが、それは動作します):単純に行われている何

let divs : Sequence(Integer) = if x < y then Sequence{1..y} else Sequence{1..x} endif 
in divs->select(z | x.mod(z) = 0 and y.mod(z) = 0)->last() 

は、各電位候補の配列が生成されていることである、そして、この配列から、のみxyを分けるものが選択され、新しい順序(順序付けられた)で格納されます。最後に、このフィルタリングされたシーケンスの最後の数字が最大公約数です。詳細で今

  1. 私たちは、このシーケンスがあるSequence{a..b}
  2. でシーケンスを生成するには、このシーケンスは不変に格納されて1からxyif x < y then Sequence{1..y} else Sequence{1..x}
  3. 間のより高い数値に行きます変数divslet divs : Sequence(Integer) = ... in ...
  4. divsから、関数は(知らないあなたのenvに存在しない場合はdivs->select(z | x.mod(z) = 0 and y.mod(z) = 0)
  5. xzための除数で最終的に、我々は唯一の新しいシーケンス(select(...)->last()

から最後の要素を取るなぜ、いくつかのOCLの実装は、独自の機能を持って)、あなたが使用することができます順序を逆にして

->sortedBy(i | -i)->at(1) 

代わりのlast()

は、最初の要素を取ります。

EDIT>

あなたはまた、発現をこのように減らすことができます。

let divs : Sequence(Integer) = Sequence{1..x.max(y)} 
in divs->select(z | x.mod(z) = 0 and y.mod(z) = 0)->last() 

または、divs

Sequence{1..x.max(y)}->select(z | x.mod(z) = 0 and y.mod(z) = 0)->last() 
+0

の使用を除去することは、それが標準OCLでサポートしますか?結果セットまたは返品セットは何ですか? – any

+0

'last()は標準のOCL(仕様、p.170)です。それは私が確信していなかった唯一のポイントでした。他のすべては明らかに標準です。この表現はあなたのためには機能しませんか? –

+0

Bythewayでは、式を減らすことができます(自分の編集を参照)。すべてが標準のOCLです。 –

関連する問題