我读到使用Divide and Conquer方法使用递归是有效的。任何人都可以建议我如何改善下面的递归调用。它只是重复元素“a”,输出80次。然而它没有任何算法只重复八十次。它如何改善性能(任何链接或指针?)
<xsl:variable name="maxcount" select="'80'" />
<xsl:variable name="count" select="'1'" />
<xsl:if test="$count > 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 <= $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>
答案 0 :(得分: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>