【问题标题】:recursive calls in xsltxslt 中的递归调用
【发布时间】:2012-06-19 14:08:14
【问题描述】:

我读到使用递归和分而治之方法是有效的。谁能建议我如何改进下面的递归调用。它所做的只是将元素“a”重复 80 次到输出。然而,它只是重复了八十次,没有任何算法。还有它如何提高性能(任何链接或指针?)

<xsl:variable name="maxcount" select="'80'" />
<xsl:variable name="count" select="'1'" />
<xsl:if test="$count &gt; 0">
  <xsl:call-template name="copyrec">
    <xsl:with-param name="index" select="'1'" />
  </xsl:call-template>
</xsl:if>
<xsl:template name="copyrec">
  <xsl:param name="index" />
  <xsl:if test="$index &lt;= $maxcount">
    <xsl:variable name="tmpind" select="$index"/>
    <a>this element repeats 80 times</a>
    <xsl:call-template name="copyrec">
      <xsl:with-param name="index" select="$tmpind + 1" />
    </xsl:call-template>
  </xsl:if>
</xsl:template>

【问题讨论】:

标签: xml xslt-1.0


【解决方案1】:

分而治之将减少此代码使用的堆栈空间量,但不会使其更快。对于 80 次重复,几乎肯定有足够的堆栈空间,所以你不妨使用它。对于 10000 次重复,如果处理器实现尾调用优化,您的代码仍然可以正常运行。但是如果你想确保即使有 10000 次迭代也不会耗尽堆栈空间,并且处理器不进行这种基本优化,那么 D+C 对于这种情况也非常简单:

<xsl:template name="copyrec">
  <xsl:param name="count" />
  <xsl:choose>
    <xsl:when test="$count = 0"/> <!-- do nothing -->
    <xsl:when test="$count = 1">
      <a>this element repeats 80 times</a>
    </xsl:when>
    <xsl:otherwise>
      <xsl:call-template name="copyrec">
        <xsl:with-param name="count" select="floor($count div 2)" />
      </xsl:call-template>
      <xsl:call-template name="copyrec">
        <xsl:with-param name="count" select="$count - floor($count div 2)" />
      </xsl:call-template>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    相关资源
    最近更新 更多