我將編寫一個計算給定函數的零的程序。我決定寫一個解析器來解析這個函數(我從來沒有寫過)。它是一個真實變量的實值函數,如"sin(1/x)+exp(x)"
。我想使用像Bisection和Newton這樣的查找方法。由於這些方法是迭代的,因此我希望避免每次在每個點的循環中評估函數x
。因此,在我努力編寫我自己的解析器之前,我想知道是否可以僅解析一次,並在點x0, x2, ..., xn
處評估函數f
,而不必爲每個x
重新解析f
?如何解析一次數學函數並多次使用其結果
回答
有兩種標準的方法解決這個問題:
解析公式爲所謂的「抽象語法樹」(AST)。這是一個表示公式結構的編譯器數據結構,它可以通過代碼快速檢查。也可以相對快速地評估AST作爲公式。見我蘇答案 建設支持上述任務的遞歸下降解析器: Is there an alternative for flex/bison that is usable on 8-bit embedded systems?
不知何故編譯公式到您的編程語言。這通常涉及到首先構建AST,然後將AST翻譯成編程語言術語,在該結果上運行編譯器,然後加載編譯結果。由於沒有動態鏈接,因此編譯語言(如C)可能會很笨拙;使用Java或C#等語言更容易,因爲它們可以鼓勵動態加載。你可以猜到,這種方法更加努力,但是回報是公式現在可以像你的編程語言一樣快地被評估。您可以通過特設(例如,遞歸下降)的解析和翻譯做到這一點,或者你使用「重寫」一個語法到另一種工具以更正規的方式解決這個:https://softwarerecs.stackexchange.com/a/31379/101
我不能得到第二部分,你的意思是把函數解析成Java代碼,把它放到一個類中,保存爲'.java'文件,編譯並加載它? – Dante
是的..挑剔,你不「解析功能到Java代碼」。您解析公式來構建代表它所說的數據結構(AST)。然後,您將構建一個小型翻譯器,用於遍歷這些數據結構併發出Java代碼。 (或C,或任何你的編程語言)。 –
也許你可以使用Java腳本支持來做到這一點。例如,應該可以在Javascript(Nashorn)中評估函數。
Pro:你不需要自己解析函數。只需提供腳本API。
由於艾拉有已經指出,您將您的表達式解析爲抽象語法樹。抽象語法樹適合您將類似於此:
interface AstNode {
double eval(double x);
}
class ConstantNode implements AstNode {
double value;
double eval(double x) {
return value;
}
}
class VariableNode implements AstNode {
double eval(double x) {
return x;
}
}
class OperatorNode implements AstNode {
char op;
AstNode left;
AstNode right;
double eval(double x) {
switch (op) {
case '+': return left.eval(x) + right.eval(x);
case '-': return left.eval(x) - right.eval(x);
case '/': return left.eval(x)/right.eval(x);
case '*': return left.eval(x) * right.eval(x);
case '^': return Math.pow(left.eval(x), right.eval(x));
default:
throw new RuntimeException("Invalid op " + op);
}
}
}
class Function implements AstNode {
...
你解析樹你的表情後,你可以叫eval()
你感興趣的值
- 1. 多次解析XML文件並將結果合併在一起
- 2. 如何使用AJAX加載文件一次並多次使用其數據?
- 3. 多次調用函數並獲得結果列表
- 4. php函數多次使用
- 5. 如何使用jquery多次調用api並將結果收集到數組中?
- 6. 如果結果不止一次使用
- 7. 多次並行調用函數
- 8. R:多次複製一個循環或函數並將結果添加到數據幀中每次
- 9. jQuery函數只能使用一次,但我需要多次
- 10. 如何多次調用函數?
- 11. 如何多次限制函數調用
- 12. 如何多次調用函數? (在setInterval())
- 13. 只有函數執行一次,即使定時器多次調用函數
- 14. 閱讀文件一次,並多次使用數據
- 15. Java - 將數據加載到內存一次,並多次使用
- 16. 解析數組[如何防止用戶投票多次]
- 17. JavaScript函數多次
- 18. jquery onclick函數多次運行多次
- 19. 如何把一個結果爲Array使用多次
- 20. jQuery多次函數調用
- 21. 多次調用onmouseover函數
- 22. 函數調用多次
- 23. HOWTO多次使用解析器?
- 24. 析構函數類再次
- 25. 調用一個異步函數多次
- 26. 如何在函數再次調用之前結束函數
- 27. 如何避免在需要組合結果時多次調用T-SQL函數?
- 28. 一次又一次的解析錯誤
- 29. declar函數中使用了很多次
- 30. 創建使用多次的函數
你可以存儲地圖。其中'x'映射到'f(x)'。 – vikingsteve