0
ocl
に2つの正の整数(それらを正確に分割する最大の整数)の最大公約数を返す演算gcd(x : Integer, y : Integer) : Integer
をどのように書くことができますか?ここでoclの最大公約数
ocl
に2つの正の整数(それらを正確に分割する最大の整数)の最大公約数を返す演算gcd(x : Integer, y : Integer) : Integer
をどのように書くことができますか?ここでoclの最大公約数
は、このためのシンプルなソリューションです(確かに効果的ではないが、それは動作します):単純に行われている何
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()
は、各電位候補の配列が生成されていることである、そして、この配列から、のみx
とy
を分けるものが選択され、新しい順序(順序付けられた)で格納されます。最後に、このフィルタリングされたシーケンスの最後の数字が最大公約数です。詳細で今
:
Sequence{a..b}
1
からx
とy
(if x < y then Sequence{1..y} else Sequence{1..x}
)divs
(let divs : Sequence(Integer) = ... in ...
)divs
から、関数は(知らないあなたのenvに存在しない場合はdivs->select(z | x.mod(z) = 0 and y.mod(z) = 0)
x
とz
ための除数で最終的に、我々は唯一の新しいシーケンス(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()
の使用を除去することは、それが標準OCLでサポートしますか?結果セットまたは返品セットは何ですか? – any
'last()は標準のOCL(仕様、p.170)です。それは私が確信していなかった唯一のポイントでした。他のすべては明らかに標準です。この表現はあなたのためには機能しませんか? –
Bythewayでは、式を減らすことができます(自分の編集を参照)。すべてが標準のOCLです。 –