我有一個數學表達式,如cos(pi * cos(pi * sin(pi * y))) 我想解決它。
不,你想評估它。解決告訴你什麼是事實的條件。評估它只是給你一個結果值。
我認爲解析它的最好方法是從字符串的末尾開始。
解析像這樣的表達式的傳統方法是使用遞歸下降。這是更一般和更容易實施。控制流看起來是這樣的:
這正是C表達式cos(M_PI * cos(M_PI * sin(M_PI * y)))
的工作方式(假設π的常見但非標準常量)。
它是評價大致從右到左(實際上內部至外),但仍讀左到右。爲了清晰起見,我們只標記了臨時值。
該控制流程往往只是變成一棵樹一樣
[cos of _]
|
[pi * _]
|
[cos of _]
|
[pi * _]
|
[sin of _]
|
[pi * y]
但很明顯,除非你需要保存的樹後,你可以只評估一次的結果。 (請注意,這個不平衡的樹仍然是一棵樹,它只是因爲表達式嵌套的方式而退化)。
...你怎麼看待它?
你的解決方案的問題是,它打破了不同的嵌套結構,例如。
cos(sin((pi * x) + y) + sin(y + (pi * x)))
不能簡單地從右到左進行評估。
你能幫我實施一下代碼嗎?
將字符串處理(標記化)從解析和評估中分離出來。獨立推理你的字符串處理和你的數學要容易得多。
你是什麼意思的「解決它」?數字,象徵性? – CroCo
我認爲你應該使用遞歸來解析這種表達式 –
「解決它」我的意思是得到一個整數,它是評估的結果,我應該給變量x和y一個值,我知道。 – Elena