如何编写一个操作gcd(x : Integer, y : Integer) : Integer
,它返回ocl
中两个正整数的最大公约数(两个正整数除以最大的整数)?
答案 0 :(得分: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()
简单地完成了生成每个候选电位的序列,然后,从该序列中,仅选择划分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
,我们只选择z
作为x
和z
divs->select(z | x.mod(z) = 0 and y.mod(z) = 0)
(select(...)->last()
last()
->sortedBy(i | -i)->at(1)
)如果你的env中不存在last()
函数(不知道为什么,但有些OCL实现带来了自己的函数),你可以使用:
let divs : Sequence(Integer) = Sequence{1..x.max(y)}
in divs->select(z | x.mod(z) = 0 and y.mod(z) = 0)->last()
而不是divs
,它反转序列并取第一个元素。
<强>编辑&gt; 强>
您也可以通过这种方式减少表达式:
Sequence{1..x.max(y)}->select(z | x.mod(z) = 0 and y.mod(z) = 0)->last()
或删除使用musik /media/sf_musik/ vboxsf defaults,_netdev,uid=1000,gid=1000,rw,fmode=0644,dmode=0750 0 0
filme /media/sf_filme/ vboxsf defaults,_netdev,uid=1000,gid=1000,rw,fmode=0644,dmode=0750 0 0
LEFT JOIN