文档章节

在XSLT样式表中使用莱布尼兹级数计算π的近似值

北风其凉
 北风其凉
发布于 2015/02/04 18:00
字数 713
阅读 409
收藏 4

初学XSLT的时候一直纠结它对循环的处理,一开始使用for-each进行简单的遍历操作,但是对更精确的循环控制总感觉力不从心。后来我在《XSLT从入门到精通》这本书中看到了一个概念“Side-Effect-Free”-基本意思就是用户不能更新变量值,因此用户对于控制函数环境只有非常有限的能力-才知道XSLT中的variable的值是无法进行二次修改的。因此,类似高级语言(如C++)中如“for(int i = 0; i < n; i++) { }”里的变量i,就不能实现了。后来我又研究了下,XSLT的循环是通过对模板(template)的递归实现的。下面是一段我写的计算圆周率的XSLT代码,使用莱布尼茨级数(Leibniz series)递归求出π/4的近似值,然后输出它的4倍即π的近似值。

1.XML文件“loop.xml”的代码

下面代码中COUNT指定递归次数,即“loop.xslt”中模板CALCULATE的调用次数

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type='text/xsl' href='loop.xslt'?>
<LOOP COUNT="10000" />

2.XSLT文件“loop.xslt”的代码

计算依据:π的莱布尼茨公式(π/4=1-1/3+1/5-1/7+1/9-...)

<?xml version="1.0" encoding="gb2312"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="html" />
  
  <!--递归计算Pi值-->
  <xsl:template name="CALCULATE">
    <xsl:param name="LOOP"/>
    <xsl:param name="COUNT"/>
    <xsl:param name="SIGN"/>
    <xsl:param name="VALUE"/>
    
    <xsl:if test="number($LOOP) &lt; number($COUNT) + 1">
      <xsl:value-of select ="number($VALUE) * 4"/>
      <xsl:text>, </xsl:text>
      <xsl:call-template name="CALCULATE">
        <xsl:with-param name="LOOP" select="number($LOOP) + 1"/>
        <xsl:with-param name="COUNT" select="number($COUNT)"/>
        <xsl:with-param name="SIGN" select="number($SIGN) * (-1)"/>
        <xsl:with-param name="VALUE" select="number($VALUE) + number($SIGN) div (number($LOOP) * 2 + 1)"/>
      </xsl:call-template>
    </xsl:if>
  
  </xsl:template>
    
  <!--计算Pi值-->
  <xsl:template match="/">
    
    <xsl:variable name="INIT_LOOP" select="1"/>
    <xsl:variable name="INIT_COUNT" select="/LOOP/@COUNT"/>
    <xsl:variable name="INIT_SIGN" select="-1"/>
    <xsl:variable name="INIT_VALUE" select="1"/>
      
    <html>
        <head>        
            <meta content="zh-cn" http-equiv="Content-Language"/>
        <meta content="text/html; charset=utf-16" http-equiv="Content-Type"/>
          <title> &#960;的莱布尼茨公式</title>
        </head>
        <body>
        
        <xsl:text>计算&#960;值 递归次数:</xsl:text>
        <xsl:value-of select="$INIT_COUNT"/>
        
        <hr/>
        
        <xsl:variable name="RESULT" >
          <xsl:call-template name="CALCULATE">
            <xsl:with-param name="LOOP" select="$INIT_LOOP"/>
            <xsl:with-param name="COUNT" select="$INIT_COUNT"/>
            <xsl:with-param name="SIGN" select="$INIT_SIGN"/>
            <xsl:with-param name="VALUE" select="$INIT_VALUE"/>
          </xsl:call-template>
        </xsl:variable>
        <xsl:value-of select="$RESULT"/>
        <xsl:text>...</xsl:text>
      
        </body>
      </html>
  
  </xsl:template>

</xsl:stylesheet>

3.loop.xml打开后的效果

这个程序迭代10000次后,得出的结果为:3.1414926535900345

附:几个维基百科上的条目

1)函数的副作用:https://en.wikipedia.org/wiki/Side_effect_%28computer_science%29

2)π的莱布尼茨公式:https://en.wikipedia.org/wiki/Leibniz_formula_for_%CF%80

---------------------------------------------------------------------------------------------------------

后来我又发现了一个更简单高效的方法让XSLT去计算Pi值,即通过在XSLT中嵌入VBScript来完成计算逻辑,详见这篇文章:《在XSLT样式表中插入VBScript脚本进行数学计算

END

© 著作权归作者所有

共有 人打赏支持
北风其凉

北风其凉

粉丝 116
博文 498
码字总数 463468
作品 4
朝阳
程序员
私信 提问
在XSLT样式表中插入VBScript脚本进行数学计算

继上次我写了篇文章《在XSLT样式表中使用莱布尼兹级数计算π的近似值》后,我发现在XSLT中使用模板的递归调用,有下面两个缺点:1)易读性差,有失灵活;2)效率低下。因此,我又想了一个新的...

北风其凉
2015/02/06
0
0
使用 Python 计算 π 值

π是一个无数人追随的真正的神奇数字。我不是很清楚一个永远重复的无理数的迷人之处。在我看来,我乐于计算π,也就是计算π的值。因为π是一个无理数,它是无限的。这就意味着任何对π的计算...

renwofei423
2013/06/02
13.6K
21
用Python学《微积分B》(Fourier级数)

  除了“幂级数”,另一类非常重要的函数项级数级数就是“三角(函数)级数”(trigonometric series)。《微积分B》第8-6节主要介绍:什么是三角级数?三角函数系的正交性?三角级数与Fou...

sagittarius_warrior
2017/09/30
0
0
3月14日圆周率日—使用并行计算求圆周率π

关于圆周率大家再熟悉不过了: 我们从课本上学习到早在一千多年前,祖冲之将圆周率计算到3.1415926到3.1415927之间…计算机诞生后,计算圆周率被用来检测计算机的硬件性能,昼夜燃烧cpu看会不...

fourinone
2013/03/14
0
25
MATLAB 元编程介绍

这篇文章对 Matlab 中的元编程进行了简单的介绍。Matlab 是一个古老而又高度专业化的语言。由于这一原因,缺乏很多在现代或者通用语言中拥有的特性。然而,用一些简单的工具,我们可以发现 ...

oschina
2015/05/18
3.7K
13

没有更多内容

加载失败,请刷新页面

加载更多

大数据教程(11.9)hive操作基础知识

上一篇博客分享了hive的简介和初体验,本节博主将继续分享一些hive的操作的基础知识。 DDL操作 (1)创建表 #建表语法CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name ...

em_aaron
今天
0
0
OSChina 周四乱弹 —— 我家猫真会后空翻

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @我没有抓狂 :#今天听这个# 我艇牛逼,百听不厌,太好听辣 分享 Led Zeppelin 的歌曲《Stairway To Heaven》 《Stairway To Heaven》- Led Z...

小小编辑
今天
2
0
node调用dll

先安装python2.7 安装node-gyp cnpm install node-gyp -g 新建一个Electron-vue项目(案例用Electron-vue) vue init simulatedgreg/electron-vue my-project 安装electron-rebuild cnpm ins......

Chason-洪
今天
3
0
scala学习(一)

学习Spark之前需要学习Scala。 参考学习的书籍:快学Scala

柠檬果过
今天
3
0
通俗易懂解释网络工程中的技术,如STP,HSRP等

导读 在面试时,比如被问到HSRP的主备切换时间时多久,STP几个状态的停留时间,自己知道有这些东西,但在工作中不会经常用到,就老是记不住,觉得可能还是自己基础不够牢固,知识掌握不够全面...

问题终结者
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部