2011-10-10 174 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個相互調用。調用哪個函數將取決於當前在表達式中處理的操作:加法,乘法,除法等。