我有一个问题分配到学校真让我困惑。基本上,在课堂上我们正在学习递归。作为家庭作业和相互递归的介绍,我们应该编写一个使用相互递归的数学表达式求值器。三种方法 getExpressionValue , getTermValue 和 getFactorValue 需要相互调用才能获得结果。我们应该支持加法,减法,乘法,除法和括号表达式。在寻找关于如何做到这一点的想法时,我不断遇到递归下降解析,但我不确定这个想法是否适合这个问题。
如果有人可以向我提供指导或者链接到解释如何解析这样的文章的链接,我将非常感激。谢谢。
答案 0 :(得分:3)
递归下降解析确实适用于此。 The Wikipedia article on the subject在C中包含一个很好的例子,它非常类似于你想要做的事情。
基本思想是这样的:如果你假设你给出的文本是一个有效的表达式,它必须以左括号或数字开头。因此,通过查看第一个字符,您知道它是否是一个括号表达式。如果不是,则文本必须是由+或 - 分隔的一个或多个术语的序列。那么你就开始将文本的开头视为一个术语。什么是术语?它是由*或/分隔的一个或多个因子的序列。因此,您开始将文本的开头视为一个因素。有什么因素?它可以是数字或带括号的表达式,通过查看第一个字符,您可以确定它是什么。如果是数字,则使用所有后续数字,以便找出数字。现在,试图弄清楚因子值是什么的方法可以将此数字返回给试图找出术语值是什么的方法。这个方法现在知道第一个数字是什么,并且它可以检查下一个字符以查看它是*还是/(编辑:它也可以是右括号,+或a - ,这意味着这个术语只包含一个数字),然后要求提取下一个因素,依此类推。
答案 1 :(得分:0)
这里的基本思想是数学表达式的片段只是较小的数学表达式。您开发了一个函数(或函数集),它将表达式分解为更小的子表达式,并将这些子表达式传递给自身以进行进一步处理。你这样做,直到你把它们一直分解成基本元素(在这种情况下,数字本身)。此时,您将评估基表达式并返回结果。值通过调用链向上渗透,以产生链顶部整个表达式的值。
递归看起来像这样:
double getValue(expression){
if(expression.isBasic)
return expression.LHS + expression.RHS
else
return getValue(expression.LHS) + getValue(expression.RHS)
}
你问题的转折是,你可能会有4个或5个相互调用的函数,而不是一个函数调用自己。调用哪个函数取决于您当前在表达式中处理的操作:加法,乘法,除法等。