gpt4 book ai didi

recursion - 递归包装一个元素

转载 作者:行者123 更新时间:2023-12-05 00:58:14 25 4
gpt4 key购买 nike

假设我有一个元素 <x>x</x>和一些空元素 (<a/>, <b/>, <c/>) ,我想一次将第一个包裹在第二个里面,结果是 <c><b><a><x>x</x></a></b></c> .当我不知道空元素的数量时,我该如何处理?

我可以

xquery version "3.0";

declare function local:wrap-up($inner-element as element(), $outer-elements as element()+) as element()+ {
if (count($outer-elements) eq 3)
then element{node-name($outer-elements[3])}{element{node-name($outer-elements[2])}{element{node-name($outer-elements[1])}{$inner-element}}}
else
if (count($outer-elements) eq 2)
then element{node-name($outer-elements[2])}{element{node-name($outer-elements[1])}{$inner-element}}
else
if (count($outer-elements) eq 1)
then element{node-name($outer-elements[1])}{$inner-element}
else ($outer-elements, $inner-element)
};

let $inner-element := <x>x</x>
let $outer-elements := (<a/>, <b/>, <c/>)

return
local:wrap-up($inner-element, $outer-elements)

但是有没有办法通过递归而不是降序和解析而是升序和构造来做到这一点?

最佳答案

在函数式编程中,您通常尝试使用列表的第一个元素和尾部,因此规范的解决方案是在嵌套元素之前反转输入:

declare function local:recursive-wrap-up($elements as element()+) as element() {
let $head := head($elements)
let $tail := tail($elements)
return
element { name($head) } { (
$head/@*,
$head/node(),
if ($tail)
then local:recursive-wrap-up($tail)
else ()
) }
};

let $inner-element := <x>x</x>
let $outer-elements := (<a/>, <b/>, <c/>)

return (
local:wrap-up($inner-element, $outer-elements),
local:recursive-wrap-up(reverse(($inner-element, $outer-elements)))
)

是否 reverse(...)实际上是否需要反转输出取决于您的 XQuery 引擎。最后,逆向不会增加计算复杂度,而且可能不仅会导致代码更清晰,而且执行速度会更快!

类似的可以通过颠倒所有内容来实现,但没有获取最后一个元素和此之前的所有内容的函数,并且在使用谓词时可能会降低性能 last()position() < last() .您可以使用 XQuery 数组,但必须在每个递归函数调用中传递计数器。

最终哪种解决方案最快需要使用特定的 XQuery 引擎和代码进行基准测试。

关于recursion - 递归包装一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33186967/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com