递归下降算法_递归下降分析程序得到的经验

递归下降算法_递归下降分析程序得到的经验递归下降算法算法模型:Term=Term+ExprExpr=Expr+FactorFactor=单个元素。最小单位。 实现原理:一个程式进入算法及被看作是一个项,分解成项加表达式的形式,表达式被分解成表达式加因子的形式,因子是这个算法中的最小单位。上一级调用比自己小一级的自己。这里三层分离,越下层模型中所形成的优先级就会越高。 我用递归下降算法写了个简单的计算器,递归算法为我的运算符号…

大家好,又见面了,我是你们的朋友全栈君。

递归下降算法

算法模型:

Term = Term + Expr

Expr=Expr+Factor

Factor =单个元素。最小单位。

 

实现原理:

一个程式进入算法及被看作是一个项,分解成项加表达式的形式,表达式被分解成 表达式加因子的形式,因子是这个算法中的最小单位。

上一级调用比自己小一级的自己。这里三层分离,越下层模型中所形成的优先级就会越高。

 

我用递归下降算法写了个简单的计算器,递归算法为我的运算符号+ – * / 等基础运算符号形成优先级。在使用的过程中发现了递归下降算法很容易产生的一个问题,左递归问题。接下来详细描述这个问题,以及解决方案。

 

什么叫左递归?

举个例子:1-2+1  正确答案应该是0,如果出现左递归答案将会是-2

所谓的左递归其实就是算式在进行同等级运算符的运算的时候强行从右至左进行了运算解析,因为递归下降法中越是后生成的运算符其优先级越高,在同等级运算中,就无法确保优先级了,在这里的体现就是算式从右至左进行了解析。

简单点说,就是虽然是应该为相同优先级的东西,因为生成的先后顺序让它从右至左残生了优先级。

左递归很容易被忽略掉,不测试特定会出BUG的算式,这个BUG是不会出现的,整个程序看上去是在完美运行,毫无破绽。但是实际上整个算式的计算顺序都出现了问题。

 

解决左递归的方案:

解决左递归无非就是解决算式的解析方式,让算式从左自右解析,但是依然能正确的形成符号的优先级就好了。

 

物理模型图对比:

左递归的时候生成的Node

     递归下降算法_递归下降分析程序得到的经验

 

算式1-2+4,越是后面生成的优先级就会高于前面生成的,所以左递归,会先计算2+4。从而导致错误。

 

解决方案:

将运算符号抽象出来单独成立一层,将数值节点统统存入Vector,这样的话,在实际生成到内存中需要判断优先级的只有+ – * / 四个了,因为递归下降算法,所以只要让 * /+ –的下一级子类中生成,就可以确保他们的优先级是正确的。

物理模型如下:

 递归下降算法_递归下降分析程序得到的经验

 

这样就用编程的手法解决了符号的优先级问题,当然也可以通过算法的优化来解决这系列问题,哈哈~!我不会。。。。

 

在来说明下这个解决方案:

内存中只new+ – * / 四个运算符号,NumberNode统统存入到Vector当中,在调用STL算法将NumberNode依次取出,计算就可以了。

 

思路是这个思路,实现代码以后更新。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/124827.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • rtmp协议详解_rtmp服务器

    rtmp协议详解_rtmp服务器前言最近在学习rtmp协议,在看官方文档的时候总是懵懵懂懂,硬生生看了两天,现在基本上了解rtmp协议了,想用自己觉得比较清晰的方式来讲解rtmp协议,希望能够对向我一样的初学者有所帮助。本文将通过以下四部分讲解rtmp协议。1、消息2、块3、rtmp的消息类型4、实例分析rtmp传输过程一、消息消息是rtmp的基本数据单元,服务端和客户端通过在网络上发送RTMP消息进行通讯。…

    2022年10月22日
    0
  • TDSCDMA SIB content[通俗易懂]

    TDSCDMA SIB content[通俗易懂]SIB1:包括NAS系统信息,UE在空闲态和连接态下所使用的定时器和常数信息。 SIB2:URAID信息。 SIB3:小区选择和重选的参数,包括Cellidentity、Cellselectionandre-selectioninfo和CellAccessRestriction三个信息IE。下面对这些IE的内容进行深入剖析。   

    2022年10月4日
    0
  • 目前主流的nosql数据库有哪些_显示器主流评测

    目前主流的nosql数据库有哪些_显示器主流评测oSQL是伴随着web2.0的迅猛发展而在2009年被提出的一个概念,一般可以通俗的理解为高性能的KeyValue存储结构的数据库,当然也有其他更广泛的类型。它基于CAP和BASE理论,强调最终一致性,具有数据结构灵活、扩展方便、大数据量下读写性能高效等特点,在互联网行业被广泛采用。本系列文章将评测广受关注的几个NoSQL数据库产品。本文关注的是HandlerSocketPlugi…

    2022年8月24日
    5
  • 【idea】推荐一个idea翻译插件:Translation「建议收藏」

    【idea】推荐一个idea翻译插件:Translation「建议收藏」打开settings-plugins,打开Browserepositories(如图):搜索”Translation”,往下找,找到图中插件install即可(我是已经安装了的)我的插件版本现在是支持谷歌、有道、百度三种翻译,其中有道和百度的需要填写应用id及secret等才能用,这个需要到有道智云(百度的没有试过)申请。使用很简单:选中单词或者段落ctrl+shift+…

    2022年6月15日
    142
  • IP地址、子网掩码、网络号、主机号、网络地址、主机地址以及ip段/数字-如192.168.0.1/24是什么意思?「建议收藏」

    IP地址、子网掩码、网络号、主机号、网络地址、主机地址以及ip段/数字-如192.168.0.1/24是什么意思?「建议收藏」背景知识IP地址IP地址被用来给Internet上的电脑一个编号。大家日常见到的情况是每台联网的PC上都需要有IP地址,才能正常通信。我们可以把“个人电脑”比作“一台电话”,那么“IP地址”就相当于“电话号码”,而Internet中的路由器,就相当于电信局的“程控式交换机”。IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节)。IP地址通常用“点分十进制”表示成(a

    2022年6月24日
    31
  • node安装及环境变量配置[通俗易懂]

    node安装及环境变量配置[通俗易懂]node安装及环境变量配置

    2022年6月10日
    53

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号