我需要找到输入序列的最大值。因此,我在下面有一个函数,但我认为它太复杂了。您能否建议是否有更简单的方法?
声明函数local:max( $ seq作为xs:anyAtomicType * )作为xs:anyAtomicType {
让$ head:= head($ seq)
让$ tail:= tail($ seq)
返回
if(empty($ seq))然后
0.0000001
其他
让$ temp:= local:max($ tail)
返回if($ head> $ temp)
然后$ head
其他$ temp
};
local:max( ( 1,5,2,19 ) )
返回值为19
答案 0 :(得分:2)
函数的递归结构正是由高阶XQuery函数fn:fold-right($seq, $start, $func)
编码的结构。因此,通过提供比较和初始值,您可以更简洁地获得相同的功能:
declare function local:max($seq as xs:anyAtomicType*) as xs:anyAtomicType? {
fn:fold-right($seq, 0.0000001, function($next, $max) {
if($max >= $next) then $max else $next
})
};
由于在这种情况下,从左到右或从右到左处理这些项目都没有关系,所以最好使用fn:fold-left(...)
,因为它可以潜在地利用对输入的流评估顺序。如果输入为空,则在XQuery中更典型的是返回空序列()
(这也是fn:max(...)
的工作)。进行以下两项更改会导致:
declare function local:max2($seq as xs:anyAtomicType*) as xs:anyAtomicType? {
fold-left($seq, (), function($max, $next) {
if($max >= $next) then $max else $next
})
};