1

Divide and Conquer メソッドで再帰を使用すると効率的であると読みました。以下の再帰呼び出しを改善する方法を誰か提案できますか。要素「a」を 80 回繰り返して出力するだけです。ただし、アルゴリズムなしで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 に答える