1

我读到使用带有分而治之方法的递归是有效的。谁能建议我如何改进下面的递归调用。它所做的只是将元素“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>
4

1 回答 1

2

分而治之将减少此代码使用的堆栈空间量,但不会使其更快。对于 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>
于 2012-06-19T14:29:03.740 回答