2012-06-19 125 views
1

我讀到使用遞歸與分隔和征服方法是有效的。任何人都可以建議我如何改善下面的遞歸調用。它所做的只是重複元素「a」,輸出80次。然而,它只是重複八十次沒有任何算法。另外它是如何提高性能(任何鏈接或指針?)遞歸調用xslt

<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> 
+0

見這個答案爲DVC的說明:http://stackoverflow.com/a/4360693/36305 –

回答

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>