2011-10-10 171 views
3

我有一个问题分配给学校,真的让我困惑。基本上,我们在课上学习递归。作为家庭作业,并介绍相互递归,我们应该写一个使用相互递归的数学表达式求值器。三种方法:getExpressionValue,getTermValuegetFactorValue需要互相调用以获得结果。我们应该支持加法,减法,乘法,除法和括号表达式。在寻找如何做到这一点的想法时,我不断遇到递归下降解析,但我不确定这个想法是否适合这个问题。Java递归数学表达式评估

如果有人能为我提供指导,或者可能以说明如何做解析像这样的文章的链接,我会非常感激。谢谢。

+4

要理解递归,首先必须了解递归。 –

+2

你的意思是[递归吗?](http://www.google.com.ng/search?hl=zh-CN&sa=X&ei=zBOTTvuND5KGhQe43bj5Dw&ved=0CCEQBSgA&q=recursion&spell=1) – Mob

+2

@Mob在谷歌这些疯狂的孩子是热闹的。 –

回答

3

递归下降解析确实适合于此。 The Wikipedia article on the subject在C中包含了一个很好的例子,它与你想要做的非常相似。

的基本思路是这样的:如果你认为你已经给出的文本是一个有效的表达式,它必须以一个左括号或以数字开头。所以通过查看第一个字符,你知道它是否是一个括号化的表达式。如果不是,则文本必须是由+或 - 分隔的一个或多个条款的序列。那么你开始把文本的开头看作是一个术语。什么是术语?它是由*或/分隔的一个或多个因子的序列。所以你开始把文本的开始视为一个因素。什么是因素?它可以是数字或括号表达式,通过查看第一个字符,可以确定它是什么。如果它是一个数字,则会消耗所有后续数字,以便找出该数字是什么。现在,试图找出因子值是什么的方法可以将此数字返回到试图找出期限值的方法。这种方法现在知道第一个数字是什么,它可以检查下一个字符,看它是否是*或/(编辑:它也可以是右括号,a +或a - ,这意味着这个术语只包含一个数字),然后要求提取下一个要素,依此类推。

+1

希望你的老师讲了一些关于递归下降解析的内容。也许它在你的书中。 ; - > –

+0

@Jeff实际上,不,完全没有。我们也不用书。这有点奇怪。 –

0

基本这里的想法是,数学表达式的作品都只是小的数学表达式。您可以开发一个函数(或一组函数),将表达式分解为更小的子表达式,并将这些子表达式传递给自身以供进一步处理。你这样做直到你将它们分解为基本元素(在这种情况下是数字本身)。此时您评估基本表达式并返回结果。该值在整个调用链中渗透,为链表顶部的整个表达式生成一个值。

递归看起来是这样的:

double getValue(expression){ 

    if(expression.isBasic) 
     return expression.LHS + expression.RHS 
    else 
     return getValue(expression.LHS) + getValue(expression.RHS) 
} 

扭转你的问题是不是一个函数调用本身,你可能会有4个或5个相互调用。调用哪个函数将取决于当前在表达式中处理的操作:加法,乘法,除法等。